我几天来一直在寻找解决方案,但我正在努力寻找一种高效且通用的方法。 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 数据结构中
使用对象更容易,但当我从多个表中检索数据并希望将它们放入具有列表和其他对象的对象时,我不确定解决此问题的最佳方法是什么。
如有任何帮助,我们将不胜感激。谢谢
如果您希望使用 Collector
来非规范化数据,您可以使用jOOQ 的
LEFT JOIN
API 支持以任意方式从平面结果集中映射事物,但很可能这些功能更合适:
下面的示例假设您是:
有关 jOOQ/Kotlin 中的可空性,请参阅 issue #13999
更多假设:
jooq-kotlin
扩展功能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))