我可以 return 每个值的键列表以将记录映射到映射中吗?
Can I return a list of keys for each value to map records into a map?
我不确定标题,但我想要的是以下内容:
table shop_offer_time_period
表示出价有多低才有效。这是由 valid_from_day
和 valid_until_day
以及 day_of_week_id
.
完成的
这样的时间段总是有效n * 7天。这意味着如果我从 2000-01-01
获取到 3000-01-01
我可能会多次获取相同的 shop_offer
如果 shop_offer_time_period
例如说报价有效 从 2015-01-01 到 2018-01-01.
每个星期一
这就是为什么我想在这样的地图中获取它
// ..
"2015-01-05": [{"offer_id":1}],
"2015-01-06": [{"offer_id":2}, {"offer_id":3}],
"2015-01-07": [],
"2015-01-08": [],
"2015-01-09": [],
"2015-01-10": [],
"2015-01-11": [],
"2015-01-12": [{"offer_id":1}],
"2015-01-13": [{"offer_id":2}, {"offer_id":3}],
// ..
我想知道我是否可以提供 RecordMapper
其中 returns 单个记录的键列表。
以下是我的抓取当前的示例。目前我正在使用 fetchInto
并在其他地方进行映射。但是,如果可能的话,我想在我的存储库中进行映射。
Table<?> asTable = this.ctx.select(
SHOP_OFFER_TIME_PERIOD.SHOP_OFFER_ID,
SHOP_OFFER_TIME_PERIOD.PRICE
)
.from(SHOP_OFFER_TIME_PERIOD)
.where(
SHOP_OFFER_TIME_PERIOD.SHOP_ID.eq(shopId)
.and(
// Contained
SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.greaterOrEqual(fromDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.lessOrEqual(toDay))
// Overlapping from left
.or(SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.lt(fromDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.gt(fromDay))
// Overlapping from right
.or(SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.lt(toDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.gt(toDay))))))
.asTable("shopOfferTimePeriod");
List<ShopOfferDTO> fetchInto = this.ctx.select(
SHOP_OFFER.ID,
SHOP_OFFER.SHOP_ID,
SHOP_OFFER.SHOP_TIMES_TYPE_ID,
asTable.field(SHOP_OFFER_TIME_PERIOD.DAY_OF_WEEK_ID),
asTable.field(SHOP_OFFER_TIME_PERIOD.PRICE)
)
.from(SHOP_OFFER)
.join(asTable)
.on(asTable.field(SHOP_OFFER_TIME_PERIOD.SHOP_OFFER_ID).eq(SHOP_OFFER.ID)
.and(SHOP_OFFER.SHOP_TIMES_TYPE_ID.eq(offerType)))
.fetchInto(ShopOfferDTO.class);
请注意,我已经将结果提取到我的 DTO 中,而不是生成的记录 object。
回答这个问题的方法有很多种。可能您正在寻找 SQL 解决方案,但按照这个问题目前的措辞方式,这个答案可能就可以了。
最直接的方法是在从数据库中获取数据后,为您提供以下两种在 Java 中创建内存中分组的方法:
使用 jOOQ API:
Map<Date, List<Integer>> result =
this.ctx.select(
...
)
.from(SHOP_OFFER).join(...)
.fetchGroups(SHOP_OFFER.DATE_COLUMN, SHOP_OFFER.ID);
(我假设你这里有这样一个 DATE_COLUMN
)
使用 Java 8
jOOQ 与 Java 8 的 Stream API (examples can be seen in this blog post) 无缝集成,因此解决问题的最有效方法可能是使用 Java 8 个流:
Map<Date, List<Integer>> result =
this.ctx.select(
...
)
.from(SHOP_OFFER).join(...)
.fetch()
.stream()
.collect(
Collectors.groupingBy(
r -> r.getValue(SHOP_OFFER.DATE_COLUMN),
Collectors.mapping(
r -> r.getValue(SHOP_OFFER.ID),
Collectors.toList()
)
)
)
我不确定标题,但我想要的是以下内容:
table shop_offer_time_period
表示出价有多低才有效。这是由 valid_from_day
和 valid_until_day
以及 day_of_week_id
.
这样的时间段总是有效n * 7天。这意味着如果我从 2000-01-01
获取到 3000-01-01
我可能会多次获取相同的 shop_offer
如果 shop_offer_time_period
例如说报价有效 从 2015-01-01 到 2018-01-01.
这就是为什么我想在这样的地图中获取它
// ..
"2015-01-05": [{"offer_id":1}],
"2015-01-06": [{"offer_id":2}, {"offer_id":3}],
"2015-01-07": [],
"2015-01-08": [],
"2015-01-09": [],
"2015-01-10": [],
"2015-01-11": [],
"2015-01-12": [{"offer_id":1}],
"2015-01-13": [{"offer_id":2}, {"offer_id":3}],
// ..
我想知道我是否可以提供 RecordMapper
其中 returns 单个记录的键列表。
以下是我的抓取当前的示例。目前我正在使用 fetchInto
并在其他地方进行映射。但是,如果可能的话,我想在我的存储库中进行映射。
Table<?> asTable = this.ctx.select(
SHOP_OFFER_TIME_PERIOD.SHOP_OFFER_ID,
SHOP_OFFER_TIME_PERIOD.PRICE
)
.from(SHOP_OFFER_TIME_PERIOD)
.where(
SHOP_OFFER_TIME_PERIOD.SHOP_ID.eq(shopId)
.and(
// Contained
SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.greaterOrEqual(fromDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.lessOrEqual(toDay))
// Overlapping from left
.or(SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.lt(fromDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.gt(fromDay))
// Overlapping from right
.or(SHOP_OFFER_TIME_PERIOD.VALID_FROM_DAY.lt(toDay)
.and(SHOP_OFFER_TIME_PERIOD.VALID_UNTIL_DAY.gt(toDay))))))
.asTable("shopOfferTimePeriod");
List<ShopOfferDTO> fetchInto = this.ctx.select(
SHOP_OFFER.ID,
SHOP_OFFER.SHOP_ID,
SHOP_OFFER.SHOP_TIMES_TYPE_ID,
asTable.field(SHOP_OFFER_TIME_PERIOD.DAY_OF_WEEK_ID),
asTable.field(SHOP_OFFER_TIME_PERIOD.PRICE)
)
.from(SHOP_OFFER)
.join(asTable)
.on(asTable.field(SHOP_OFFER_TIME_PERIOD.SHOP_OFFER_ID).eq(SHOP_OFFER.ID)
.and(SHOP_OFFER.SHOP_TIMES_TYPE_ID.eq(offerType)))
.fetchInto(ShopOfferDTO.class);
请注意,我已经将结果提取到我的 DTO 中,而不是生成的记录 object。
回答这个问题的方法有很多种。可能您正在寻找 SQL 解决方案,但按照这个问题目前的措辞方式,这个答案可能就可以了。
最直接的方法是在从数据库中获取数据后,为您提供以下两种在 Java 中创建内存中分组的方法:
使用 jOOQ API:
Map<Date, List<Integer>> result =
this.ctx.select(
...
)
.from(SHOP_OFFER).join(...)
.fetchGroups(SHOP_OFFER.DATE_COLUMN, SHOP_OFFER.ID);
(我假设你这里有这样一个 DATE_COLUMN
)
使用 Java 8
jOOQ 与 Java 8 的 Stream API (examples can be seen in this blog post) 无缝集成,因此解决问题的最有效方法可能是使用 Java 8 个流:
Map<Date, List<Integer>> result =
this.ctx.select(
...
)
.from(SHOP_OFFER).join(...)
.fetch()
.stream()
.collect(
Collectors.groupingBy(
r -> r.getValue(SHOP_OFFER.DATE_COLUMN),
Collectors.mapping(
r -> r.getValue(SHOP_OFFER.ID),
Collectors.toList()
)
)
)