如何高效地将jooq记录映射到kotlin域

问题描述 投票:0回答:1

我几天来一直在寻找解决方案,但我正在努力寻找一种高效且通用的方法。 Jooq 文档以及在线解决方案并没有真正让我有机会掌握如何将记录映射到对象

Jooq Records 映射似乎是一个非常好的解决方案,但当涉及到复杂对象时我不知道如何实现它。

考虑以下因素:

data class Person(
    val id: String,
    val name: String,
    val state: Boolean,
    val roles: List<Role> = emptyList(),
    val vehicle: Vehicle
)
data class Role(
    val id: String,
    val personId: String,
    val name:String,
    val description
)
data class Vehicle(val id: String, val personId: String,val name: String, val type: String)

这是我使用 Jooq 从数据库读取数据的乐趣:

        val record = mysqlDSLContext.select()
            .from(PERSON)
            .leftJoin(ROLES).on(PERSON.ID.eq(ROLE.PERSON_ID))
            .leftJoin(VEHICLE).on(PERSON.ID.eq(VEHICLE.PERSON_ID))
            .fetchOne()

我想将其映射到 Person 数据结构中

使用对象更容易,但当我从多个表中检索数据并希望将它们放入具有列表和其他对象的对象时,我不确定解决此问题的最佳方法是什么。

如有任何帮助,我们将不胜感激。谢谢

kotlin mapping jooq
1个回答
0
投票

如果您希望使用 Collector

 来非规范化数据,您可以使用 
jOOQ 的 LEFT JOIN
 API 支持
以任意方式从平面结果集中映射事物,但很可能这些功能更合适:

下面的示例假设您是:

  • 使用JavaGenerator,从平台类型中获利
  • 在数据类中使用可为空的值

有关 jOOQ/Kotlin 中的可空性,请参阅 issue #13999

更多假设:

  • 您使用的是更新版本的 MySQL (8+)
  • 您正在使用
    jooq-kotlin
    扩展功能
  • 您正在使用最新的 jOOQ 版本(3.19+)
val result: List<Person> =
ctx.select(
       PERSON.ID,
       PERSON.NAME,
       PERSON.STATE,
       multiset(
           select(
               PERSON.role.ID,
               PERSON.role.PERSON_ID,
               PERSON.role.NAME,
               PERSON.role.DESCRIPTION,
           )
           .from(PERSON.role)
       ).mapping(::Role),
       row(
           PERSON.vehicle.ID,
           PERSON.vehicle.PERSON_ID,
           PERSON.vehicle.NAME,
           PERSON.vehicle.TYPE
       ).mapping(::Vehicle)
   )
   .from(PERSON)
   .fetch(Records.mapping(::Person))
© www.soinside.com 2019 - 2024. All rights reserved.