为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2022-05-25 16:18:50
我的数据库中有两个表,这些表具有完全相同的列和数据类型,但顺序不同。表 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)在联合函数内部的变量上,它涉及到 SelectUnionStep 中关于联合(ARecord)不能应用于联合(BRecord)的类型不匹配。我在 JooQ 哪里可以合并这两张表?
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信