如何让JooQ合并两个不同的表,它们具有相同的列和数据类型?

时间:2019-01-29 17:46:15

标签: java sql jooq

我的数据库中有两个表,这些表具有相同的确切列和数据类型,但顺序不同。

表A的列为:A,B,C,D。

表B的列为:A,C,D,B。

我有一个使用JooQ来查询数据库的应用程序,它使用了Codegen来创建表和记录。但是,由于编译错误,它不允许我合并两个select语句。我该怎么做才能合并两个表?

StepWhereSelect<ARecord> query = dsl.selectFrom(A);
StepWhereSelect<BRecord> query2 = dsl.selectFrom(B);
query.union(query2)

在union函数内部的变量上,它与关于SelectUnionStep的类型不匹配有关,有关about(ARecord)不能应用于union(BRecord)。

在JooQ中我可以在哪里合并这两个表?

1 个答案:

答案 0 :(得分:1)

您要寻找的是jOOQ对SQL标准语法UNION CORRESPONDING的支持。我知道,目前尚没有在任何RDBMS中实现该语法,但是jOOQ可以轻松地对其进行仿真。如果没有此语法支持,则可以使用以下代码在两个子查询中创建正确的列顺序:

var q1 = dsl.select(Stream.of(A.fields()).sorted(Field::getName).collect(toList()))
            .from(A);
var q2 = dsl.select(Stream.of(B.fields()).sorted(Field::getName).collect(toList()))
            .from(A);
q1.union(q2).fetch();

当然,这不再具有类型安全性。如果您仍然想接收ARecord类型,可以写

q1.union(q2).fetchInto(A);