繁体   English   中英

我怎样才能让 JooQ 联合两个不同的表,它们具有相同的列和数据类型?

[英]How can I have JooQ union two different tables, that have the same columns and datatypes?

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

表 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 中关于 union(ARecord) 不能应用于 union(BRecord) 的类型不匹配。

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

您正在寻找的是 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM