我有两条记录对应两个不同的表(recordA、tableA、recordB 和 tableB)。TableA 和 TableB 具有相同的列名和相同的类型。我如何使用 Jooq 选择它们并将结果映射到不同的记录?
我尝试过这种方法:
fun findEntitiesByGroupId(groupId: UUID): ResultData {
val entityAQuery = DSL.using(configuration)
.selectFrom(ENTITY_A)
.where(ENTITY_A.GROUP_ID.eq(groupId))
val entityBQuery = DSL.using(configuration)
.selectFrom(ENTITY_B)
.where(ENTITY_B.GROUP_ID.eq(groupId))
val entityA = mutableListOf<EventHistory>()
val entityB = mutableListOf<EventHistory>()
entityAQuery.unionAll(entityBQuery).forEach {
when (it) {
is EntityARecord -> entityA.add(mapEntityA(it))
is EntityBRecord -> entityB.add(mapEntityB(it))
else -> throw AssertionError("Invalid entity type")
}
}
return ResultData(entityA, entityB)
}
我在unionAll
方法中收到编译错误:
Type mismatch.
Required:
Select<out EntityARecord!>!
Found:
SelectConditionStep<EntityBRecord!>
我没有找到有关这种联合场景的任何 Jooq 文档,只是针对我们具有相同记录类型的情况。
关于编译错误:
这两种类型在 Java/Kotlin 中不兼容,因此您无法使用
selectFrom(table)
当前的方式。您可以select().from(table)
改为使用,从查询中删除行类型安全,或者明确列出所有列。关于映射期望:
jOOQ 无法自动将源自
UNION
或类似 SQL 运算符的行映射到“正确”的映射器。我已就此主题撰写了整整一篇博客文章,以详细说明为什么这是不可能的:简而言之,jOOQ 无法
UNION ALL
自动知道哪条记录属于哪个子查询。因此,jOOQ 只会考虑第一个子查询的行类型(以及相关的转换器/映射器)UNION ALL
。但是,您可以向联合中添加一个鉴别器列,并据此自行做出决定,例如:
然后,例如: