jOOQ 3.16 获取一对一

jOOQ 3.16 fetch one to one

我想按如下方式获取 DTO:

data class CartItemDto(
    val id: UUID
    val product: ProductDTO 
) 

我目前能实现的唯一方法是执行两个单独的查询,然后将这两个结果组合到上面的数据 class 中,但我想在一个 jOOQ 查询中完成所有操作。 Multiset 不是一个选项,每当我们在自定义 field 中使用 jsonObject 时,它就不起作用。

我在 Internet 上可以找到的唯一示例是带有列表的 DTO:

data class CartItemDto(
    val id: UUID
    val product: List<ProductDto> 
) 

额外信息

ProductDto:

data class ProductDto(
    val id: UUID
    val title: String
) 

当前查询:

databaseRepository.getConnection()
                .select(CART_ITEM.CART_ID,
                        row(
                            PRODUCT.ID,
                        ).mapping(::ProductDto))
                .from(CART_ITEM)
                .join(PRODUCT)
                .on(PRODUCT.ID.eq(CART_ITEM.PRODUCT_ID))
                .fetch(Records.mapping(::CartItemDto))

但这只有在我使数据 class 字段可为空时才有效。

映射到 data class 的 jOOQ 方法是使用 nested records,例如

ctx.select(PRODUCT.ID, row(PRODUCT.A, PRODUCT.B, ...).mapping(::ProductDTO))
   .from(PRODUCT)
   .fetch(Recods.mapping(::DTO)) // Your data class, whatever it's called

这是类型安全且推荐的方式。从 jOOQ 3.17 开始,你甚至可以 project the entire T table as a nested record,例如

ctx.select(PRODUCT.ID, PRODUCT.mapping(::ProductDTO))
   .from(PRODUCT)
   .fetch(Recods.mapping(::DTO)) // Your data class, whatever it's called

或者,您可以使用使用反射和嵌套列别名的经典方法:

ctx.select(
        PRODUCT.ID,
        PRODUCT.A.as("product.a"),
        PRODUCT.B.as("product.b"))
   .from(PRODUCT)
   .fetchInto(DTO::class.java) // Your data class again

但我建议改用类型安全的方法,它也可以与 MULTISET 一起使用。