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
一起使用。
我想按如下方式获取 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
一起使用。