如何在QueryDSL(Java)中實現組的計數?如何計算QueryDSL中結果組的數量?
背景
我採取一個表,在這裏我想組返回之前的結果分頁搜索。
除了通常的LIMIT x OFFSET y
查詢,我還希望收到總行數。
這是一個頁面(簡化)SQL查詢:
SELECT x, y, MAX(z)
FROM tasks
WHERE y > 10
GROUP BY x, y
LIMIT 10 OFFSET 0
要檢索的行數,我試圖用一種天真COUNT(*)
代替x, y, MAX(z)
這樣的:
SELECT COUNT(x)
FROM tasks
WHERE y > 10
GROUP BY x, y
不幸的是,這並不會產生一行與前一個查詢返回的組的數量,而是每組有一行,每行都有分組在一起的行數 - 像往常一樣用於聚合函數,COUNT
chan當存在GROUP BY
時表示其含義。 (至少在PostgreSQL裏,我們使用的是在這裏。)
我們可以通過使用第一個SELECT語句的子查詢FROM子句中的檢索總數:
SELECT COUNT(*)
FROM (SELECT x, y, MAX(z)
FROM tasks
WHERE y > 10
GROUP BY x, y
)
現在困難的部分:我們如何在JPQL和/或QueryDSL中做到這一點?
前兩個查詢是由代碼產生這樣的:
QTask qTask = QTask.task;
Expression<?>[] groupExps = { qTask.x, qTask.y };
Predicate predicate = qTask.y.gt(10);
List<Result> results = getQueryDSL().createQuery()
.from(qTask)
.where(predicate)
.groupBy(groupExps)
.offset(0)
.limit(10)
.list(ConstructorExpression.create(Result.class,
qTask.x
qTask.y,
qTask.z.max()))
Long total = getQuerydsl().createQuery()
.from(qTask)
.where(predicate)
.groupBy(groupExps)
.singleResult(qTask.x.count());
它看起來像JPA/JPQL doesn't support subselects other than in WHERE or HAVING-clauses,即它們不可能在FROM子句。這似乎是JPA的QueryDSL不支持它們的原因。
有沒有辦法重寫這個聲明,或者以某種方式解決這個限制?
我也在尋找類似的問題的解決方案如下圖所示 'SELECT COUNT(*)作爲來自其股票stock0_總和(stock0_.QTY)> col_0_0_從(SELECT COUNT(stock0_.stock_ ID)的計= 10 0)tbl;' 如果你有答案,請讓我知道。 – 2016-08-16 13:43:36