Jos*_*ick 4 java postgresql jooq
这篇文章是我在类似问题上留下的评论结果:https://stackoverflow.com/a/19860271/2308858
我正在使用PostgreSQL和jOOQ 3.4并尝试在jOOQ中表示以下SQL查询:
SELECT *, COUNT(*) OVER()
FROM table1 t1
JOIN table2 t2 ON (t1.id = t2.id)
JOIN table3 t3 ON (t1.otherId = t3.otherId)
Run Code Online (Sandbox Code Playgroud)
我喜欢Postgres如何让我简洁地代表"所有专栏和count专栏" SELECT *, COUNT(*) OVER().但是当我尝试在jOOQ中表示相同的查询时,我能做的最简洁的方法是:
create.select( TABLE1.fields() ).select( TABLE2.fields() ).select( TABLE3.fields() ).select( count().over() )
.from( TABLE1 )
.join( TABLE2 ).on( TABLE1.ID.equal( TABLE2.ID ))
.join( TABLE3 ).on( TABLE1.OTHER_ID.equal( TABLE3.OTHER_ID ))
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会写这个:
create.select().select( count().over() )
.from( TABLE1 )
.join( TABLE2 ).on( TABLE1.ID.equal( TABLE2.ID ))
.join( TABLE3 ).on( TABLE1.OTHER_ID.equal( TABLE3.OTHER_ID ))
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.有关如何做到这一点的任何想法?
你自己发现的这个解决方案确实是采用jOOQ API的方法:
create.select( TABLE1.fields() )
.select( TABLE2.fields() )
.select( TABLE3.fields() )
.select( count().over() )
...
Run Code Online (Sandbox Code Playgroud)
它在概念上对应于此有效的SQL查询:
SELECT table1.*, table2.*, table3.*, COUNT(*) OVER()
...
Run Code Online (Sandbox Code Playgroud)
但如果这对你很烦人,你也可以通过这个小技巧解决这个问题:
// Get access to the "model API" from a statement without any SELECT fields
SelectQuery<?> select =
create.select()
.from( TABLE1 )
.join( TABLE2 ).on( TABLE1.ID.equal( TABLE2.ID ))
.join( TABLE3 ).on( TABLE1.OTHER_ID.equal( TABLE3.OTHER_ID ))
.getQuery();
// Copy all fields from the SELECT statement:
List<Field<?>> fields = new ArrayList<>(select.getSelect());
// And explicitly add them:
select.addSelect(fields);
select.addSelect(count().over());
Run Code Online (Sandbox Code Playgroud)
这与您最初的尝试同样冗长,但通常可能更简单一些.
当然,您也可以简单地编写以下等效SQL查询,这将是更标准的SQL:
SELECT t.*, COUNT(*) OVER()
FROM (
SELECT *
FROM table1 t1
JOIN table2 t2 ON (t1.id = t2.id)
JOIN table3 t3 ON (t1.otherId = t3.otherId)
) t
Run Code Online (Sandbox Code Playgroud)
使用jOOQ,这将转换为:
Table<?> t = select()
.from( TABLE1 )
.join( TABLE2 ).on( TABLE1.ID.equal( TABLE2.ID ))
.join( TABLE3 ).on( TABLE1.OTHER_ID.equal( TABLE3.OTHER_ID ))
.asTable("t");
create.select(t.fields(), count().over())
.from(t);
Run Code Online (Sandbox Code Playgroud)
在jOOQ的未来版本中,可能通过jOOQ API显式支持实际的星号(*).在这一点上,有些不清楚如何在语法上实现这一点.
我总是发现PostgreSQL在这里允许这种语法非常好奇:
SELECT *, COUNT(*) OVER()
...
Run Code Online (Sandbox Code Playgroud)
SQL引擎几乎不支持它,并且有点"不可预测".SQL标准也不允许将"独立星号"与其他列表达式结合使用.
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |