我有一个问题:不知道如何映射Jooq查询的结果.

我有两个实体:支付方式和货币.付款方式中包含一个列表.两者都存储在不同的表中.

我有一个:

public Optional<PaymentMethod> getMethod(Long id) {
return this.dslContext.selectFrom(PAYMENT_METHOD)
    .where(
        PAYMENT_METHOD.ID.eq(id),
        PAYMENT_METHOD.DELETED.eq(false)
    ).fetchOptional().map(v -> methodDao.mapper().map(v));

还想通过以下方式获得货币:

return this.dslContext.select(asterisk())
    .from(PAYMENT_METHOD)
    .join(PAYMENT_METHOD_CURRENCY)
    .on(PAYMENT_METHOD_CURRENCY.METHOD_ID.eq(id))
    .where(
        PAYMENT_METHOD.ID.eq(id),
        PAYMENT_METHOD.DELETED.eq(false)
    )
    .fetch()
    .map(...)...

那么,我该如何进一步绘制这张 map 呢?

我对另一个实体中的一个实体有一个决定,比如:

private PaymentProviderMethod mapMethod(Record record) {
final PaymentMethodRecord methodRecord = record.into(PAYMENT_METHOD);
final PaymentProviderRecord providerRecord = record.into(PAYMENT_PROVIDER);
return new PaymentProviderMethod(
    methodDao.mapper().map(methodRecord),
    providerDao.mapper().map(providerRecord));

但我不知道在这种情况下如何映射列表.你能帮忙吗?

推荐答案

如果想用jOOQ嵌套集合,那么可能需要MULTISETMULTISET_AGG运算符以及ad-hoc conversion,后者允许使用类型安全nesting collections directly in SQL, if your database product support SQL/XML or SQL/JSON.

以下可能不是您想要的确切查询,但您知道了:

// Assuming the usual static import:
import static org.jooq.impl.DSL.*;

ctx.select(
       PAYMENT_METHOD.ID,
       PAYMENT_METHOD.PROVIDER_ID,
       PAYMENT_METHOD.NAME,
       ...
       multiset(
           select(
               PAYMENT_METHOD_CURRENCY.ID,
               PAYMENT_METHOD_CURRENCY.NAME,
               ...
           )
           .from(PAYMENT_METHOD_CURRENCY)
           .where(PAYMENT_METHOD_CURRENCY.METHOD_ID.eq(PAYMENT_METHOD.ID))
       ).convertFrom(r -> r.map(Records.mapping(Currency::new)))
   )
   .from(PAYMENT_METHOD)
   .fetch(Records.mapping(PaymentMethod::new))

上面的例子将MULTISET用于嵌套的相关子查询,但您可以对MULTISET_AGGJOINGROUP BY子句进行同样的操作,尤其是在您的方言不支持correlating derived tables, see issue #12045的情况下.整个查询是类型安全的.如果将PaymentMethodCurrency DTO类更改为类,查询将停止编译,直到修复投影.

Java相关问答推荐

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

Character::Emoji不支持带数字的字符吗?

Java函数式编程中的双值单值映射

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

相同的Java SerializedLambda为implMethodKind返回不同的结果

Mapstruct不能正确/完全映射属性

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

如何在代码中将行呈现在矩形前面?

在Eclipse中调试未导出的JDK模块的Java包

try 从REST API返回对象列表时出错

无法使用Freemarker从XML中读取重复的标记值

除0错误/抱歉我的句子是PT

没有Tomcat,IntelliJ如何在本地运行API?

如何使用jooq更新记录?

如何使用Java对随机生成的字母数字优惠券代码进行过期设置

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

H2数据库仅支持%1个结果集?