【问题标题】:How can I use fetchMap() with a RecordMapper?如何将 fetchMap() 与 RecordMapper 一起使用?
【发布时间】:2016-12-28 02:47:10
【问题描述】:

我知道我可以获取这样的地图:

this.ctx.select(
        shopSubscription.field(SHOP_SUBSCRIPTION.SHOP_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID),
        PAYMENT_GATEWAY_SUBSCRIPTION.SUBSCRIPTION_ID_TOKEN
        )
    .from(PAYMENT_GATEWAY_SUBSCRIPTION)
        .join(shopSubscription)
            .on(PAYMENT_GATEWAY_SUBSCRIPTION.ID.eq(shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID))
                    .and(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID.eq(paymentGatewayType)))
        .fetchMap(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID, ShopSubscriptionDTO.class);

但为了在编译时检测问题,我希望我可以在此查询中另外添加 RecordMapper

那么有没有办法打电话给fetchMap(),同时也提供一个RecordMapper

我的想法是这样的:

this.ctx.select(
        shopSubscription.field(SHOP_SUBSCRIPTION.SHOP_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID),
        PAYMENT_GATEWAY_SUBSCRIPTION.SUBSCRIPTION_ID_TOKEN
        )
    .from(PAYMENT_GATEWAY_SUBSCRIPTION)
        .join(shopSubscription)
            .on(PAYMENT_GATEWAY_SUBSCRIPTION.ID.eq(shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID))
                    .and(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID.eq(paymentGatewayType)))

        // For each record apply the map() function

        .map(new RecordMapper<Record<?>, ShopSubscriptionDTO>() {
            @Override
            public ShopSubscriptionDTO map(Record<?> record) {
                ShopSubscriptionDTO shopSubscriptionDto = new ShopSubscriptionDTO();

                shopSubscriptionDto.setShopId(record.getValue(SHOP_SUBSCRIPTION.SHOP_ID)
                // ...

                return shopSubscriptionDto;
            }
        });

        // Fetch the result into a map where the key is SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID
        .fetchMap(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID);

【问题讨论】:

  • 有接受 RecordMapper 参数的 fetchMap() 重载,例如fetchMap(RecordMapper, RecordMapper),但我不确定这是否是你要找的。你想用它们做什么?
  • @LukasEder 我正在寻找的是一种为结果HashMap 的所有值实现RecordMapper 的方法,以便将所选数据转换为业务对象。
  • 对不起,我还是不太清楚这意味着什么。您能否用预期的代码/类型等更新您的问题?
  • @LukasEder 当然 :) 我添加了一个示例,我认为它可能看起来像 - 我希望这是有道理的 ^^
  • 啊,我明白了。好吧,请随意回答您自己的问题,然后:)

标签: java sql jooq


【解决方案1】:

由于fetchMap() 有很多不同的实现,我没有看到fetchMap(Field&lt;K&gt;, RecordMapper&lt;? super R, R&gt;) 也有。因此,这样做有助于解决这个问题:

// ...
.fetchMap(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_ADD_ON_TYPE_ID, new RecordMapper<Record, AdminToolAddOnDTO>() {

    @Override
    public AdminToolAddOnDTO map(Record record) {

        AdminToolAddOnDTO dto = new AdminToolAddOnDTO();

        dto.setId(record.getValue(ADMIN_TOOL_ADD_ON.ID));
        dto.setAdminToolFeatureTypeId(record.getValue(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_FEATURE_TYPE_ID));
        dto.setAdminToolAddOnTypeId(record.getValue(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_ADD_ON_TYPE_ID));
        dto.setPrice(record.getValue(ADMIN_TOOL_ADD_ON.PRICE));
        dto.setCountryId(record.getValue(ADMIN_TOOL_ADD_ON.COUNTRY_ID));
        dto.setAddOnIdToken(record.getValue(ADMIN_TOOL_ADD_ON_TYPE.ADD_ON_ID_TOKEN));

        return dto;
    }
});

【讨论】:

    【解决方案2】:

    java 8 或更高版本

    .fetchMap(CN_TASKS.AGENTID,
                            r -> new CnTaskMessage(r.getValue(CN_TASKS.CN_TASKID), r.getValue(CN_TASKS.TASK_TYPE),
                                    r.getValue(CN_TASKS.STATUS)));
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2021-01-02
      • 2020-07-18
      • 1970-01-01
      • 2023-03-13
      • 2014-09-25
      • 2016-01-30
      • 2015-12-13
      • 2020-09-15
      相关资源
      最近更新 更多