QueryDSL (Java)에서 그룹 수를 구현하려면 어떻게해야합니까?QueryDSL의 결과 그룹 수는 어떻게 계산합니까?
내가 그룹을 반환하기 전에 결과를 원하는 테이블에 페이지 된 검색을 구현하고있어
배경입니다.
일반적인 LIMIT x OFFSET y
쿼리 외에도 전체 행 수를 받기를 원합니다.
이
한 페이지에 대한 (간체) SQL 쿼리입니다 :SELECT COUNT(x)
FROM tasks
WHERE y > 10
GROUP BY x, y
:
SELECT x, y, MAX(z)
FROM tasks
WHERE y > 10
GROUP BY x, y
LIMIT 10 OFFSET 0
행의 수를 검색하려면,이 같은 x, y, MAX(z)
대신 순진 COUNT(*)
을 사용하려
아쉽게도 이전 쿼리에서 반환 한 그룹 수와 함께 하나의 행을 생성하지 않지만 각 그룹에 대해 하나의 행을 그룹화합니다 (그룹화 된 행 수는 일반적으로 집계 함수의 경우 COUNT
). GROUP BY
이있을 때 그 의미를 부여합니다. (PostgreSQL을에서 적어도, 우리는 여기에 무엇을 사용하고 있습니다.)
우리는 절에서의 부속으로 첫 번째 SELECT 문을 사용하여 총 수를 검색 할 수 있습니다 : 이제
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이 그것들을 지원하지 않기 때문인 것으로 보인다.
이 문을 다시 쓰거나이 제한을 해결하는 방법이 있습니까?
나는 또한 주식 stock0_ 가진 합 (stock0_.QTY)>에서 col_0_0_로 (SELECT COUNT (stock0_.stock_ 아이디)에서 계수로 아래 'SELECT COUNT (*)와 같은 유사한 문제에 대한 솔루션을 찾고 있어요 = 10 0) tbl;' 답을 얻었 으면 알려주세요. –