将以下语句转换为int x=0, y=0, z=0;
z = (x==1) && (y=2);
printf("%d ", y);
时出现问题:
jooq API
我尝试使用SELECT t1.col1, t1.col2, t1.col3, (SELECT count(*) FROM table2 where table2.col2 = t1.col1)
FROM table1 t1
和DSL.count()
,但在搜索将where子句添加到count子查询时失败了。
数据库是PostgreSQL 9.6。
答案 0 :(得分:1)
Lukas建议使用DSL.field
是更好的解决方案,因为它会保留<T>
类型。
更多类型安全版本:
TableField<Table1Record, Long> col1 = TABLE1.COL1;
Field<Integer> count = DSL.field(DSL.selectCount().from(TABLE2).where(TABLE2.COL2.eq(col1)));
using(configuration).select(col1, count).from(TABLE1).fetch();
我的第一个(类型较少)解决方案:
TableField<Table1Record, Long> col1 = TABLE1.COL1;
Field count = DSL.selectCount().from(TABLE2).where(TABLE2.COL2.eq(col1)).asField("count");
using(configuration).select(col1, count).from(TABLE1).fetch();
也许有更优雅的解决方案,但它确实有效。生成的查询看起来像我的原始查询。
答案 1 :(得分:0)
以下是使用DSL.field(...)
的另一个示例:
Field<Integer> COUNT = DSL.field("COUNT(*) OVER ()", Integer.class);
List<Map<String, Object>> records = DSL.select(ACCESSORY.ID,
ACCESSORY.NAME,
ACCESSORY.TYPE,
ACCESSORY.PRICE,
BRAND.NAME,
COUNT.as("total"))
.from(ACCESSORY)
.innerJoin(BRAND).onKey()
.fetchMaps();
ResultSet将包含一个名为total
的列,该列将被视为类型java.lang.Integer
。这适用于PostgreSQL 9.6。
COUNT(*) OVER ()
的详细说明可在此处找到:here。