JOOQ中关联临时表,明确临时表别名,关联后返回临时表中的列的语法

本文参考了网上相关的这篇资源http://www.chinaoc.com.cn/p/1293500.html

jooq 在执行sql 时,一般情况下是只从一个表中查询出数据

dsl.selectFrom(table).where(table.FIELD.eq(value)).execute();
dsl.selectFrom(table).where(table.FIELD.eq(value)).fetchResultSet();
dsl.selectFrom(table).where(table.FIELD.eq(value)).fetchInto(entity.class);

简单的从一个表中查询查询 返回执行行数或者结果集(resultset)或者直接返回映射的实体类List。

或者是从两个数据库中的表进行连接

TableLeftT leftT = TableLeftT.TABLELEFT;
TableRightT rightT = TableRightT .TABLERIGHTT;

ResultSet  rs = dsl.select(leftT.field1,rightT.field2).from(leftT).leftJoin(rightT )
.on(leftT.field3.eq(rightT.field4)).where(condition).fetch().intoResultSet();

其中leftT和rightT 都是数据库中的表。这种情况下可以直接对他们进行连接 声明两个表的table 对象后进行jooq 的语法操作即可

但是有一种情况,目前在网络上没怎么找到相关的博客可以参考,就是连接的表中 ,至少有一个表是之前某一步或者后面某一步从数据库中经过操作得到的临时表或者结果集(关系)的情况

下面直接贴写法和例子

dsl.select(
table.FIELDA,
DSL.field(Dsl.name("righTable","FIELDX"),String,class).as("nickName")
).from(table)
.crossJoin(
dsl.select(table.FIELDX).from(table).where(condition).asTable("rightTable")
)
.where(condition)
.fetch()
.intoResultSet();


上述代码中查出满足条件的一列作为临时表与主表做笛卡尔积。(不要考虑笛卡尔积的效率等问题,这只是工作中的碰巧遇到一个实例)。首先使用

.asTable("name")

的方法得到名称为“name”的临时表

然后在主查询中自定义选择临时表的某一列作为输出的

DSL.field(Dsl.name("righTable","FIELDX"),String,class).as("nickName")

其中 rightTable 是临时表的别名,FIELDX 是临时表中的一列名,后面根据这一列的数据类型给出String.Class

最后 在给这一列起别名“nikeName”。则最后在结果中能正确取到临时表中的列

===================================================================================

这里贴一下自己在工作中遇到的一个坑,在上述查询中可以看出临时表和主表是同一个表 table,于是如果按照以前的写法

TableT lt = TableT .TABLE;
TableT rt = TableT .TABLE;

ResultSet  rs = dsl.select(lt.field1,rt.fieldX).from(lt).crossJoin(select(rt.fieldX)
.from(rt).where(condition)).where(condition).fetch().intoResultSet();

将同一张表声明两次 lt,rt 并且从rt 中查出结果集作为临时表但不起临时表名和列名,想当然的在得结果时试用rt作为临时表的表名,这种情况下会出现拿错列的情况。

因为lt 和rt 其实指向的是同一张表table

在jooq将上述语法转为可执行sql 的过程中 ,rt.field 转换成 table.fieldX 而不是临时表的fieldX。会出现丢失查询 或者结果列错乱的问题!!!!!!!!!

如果在实际应用只用出现类似的问题,可以考虑一下通过给临时表取明确的表明和列名来解决

你可能感兴趣的:(jooq)