2017-12-18 694 views
0

内选择计数我有一个问题,同时将下面的语句为jooq APIJOOQ - 选择查询

SELECT t1.col1, t1.col2, t1.col3, (SELECT count(*) FROM table2 where table2.col2 = t1.col1) 
FROM table1 t1 

DSL.count()DSL.selectCount()尝试过,但我失败了,而搜索的方式来where子句添加到计数子查询。

该数据库是PostgreSQL 9.6。

回答

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(); 

也许还有一个更优雅的解决方案,但它的工作原理。生成的查询看起来像我原来的查询。

+0

['FieldLike.asField()'](https://www.jooq.org/javadoc/latest/org/jooq/FieldLike.html#asField--)是实现它的一种方法。另一种方法是使用['DSL.field(Select)']封装相关子查询(https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#field-org.jooq .Select-),它保留了''类型并阻止使用原始类型。 –

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(); 

的结果集将包含一个称为total柱,其将被视为一种类型的java.lang.Integer。这适用于PostgreSQL 9.6。

COUNT(*) OVER()的详细说明可以在这里找到:here