我可以 return 每个值的键列表以将记录映射到映射中吗?

Can I return a list of keys for each value to map records into a map?

我不确定标题,但我想要的是以下内容:

table shop_offer_time_period 表示出价有多低才有效。这是由 valid_from_dayvalid_until_day 以及 day_of_week_id.

完成的

这样的时间段总是有效n * 7天。这意味着如果我从 2000-01-01 获取到 3000-01-01 我可能会多次获取相同的 shop_offer 如果 shop_offer_time_period 例如说报价有效 2015-01-012018-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()
        )
    )
)