內選擇計數我有一個問題,同時將下面的語句爲jooq API
:JOOQ - 選擇查詢
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。
內選擇計數我有一個問題,同時將下面的語句爲jooq API
:JOOQ - 選擇查詢
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。
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();
也許還有一個更優雅的解決方案,但它的工作原理。生成的查詢看起來像我原來的查詢。
下面是使用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。
['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-),它保留了''類型並阻止使用原始類型。 –