2014-09-05 3 views
0

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이 그것들을 지원하지 않기 때문인 것으로 보인다.

이 문을 다시 쓰거나이 제한을 해결하는 방법이 있습니까?

+0

나는 또한 주식 stock0_ 가진 합 (stock0_.QTY)>에서 col_0_0_로 (SELECT COUNT (stock0_.stock_ 아이디)에서 계수로 아래 'SELECT COUNT (*)와 같은 유사한 문제에 대한 솔루션을 찾고 있어요 = 10 0) tbl;' 답을 얻었 으면 알려주세요. –

답변

1

내가 JPA와 JQL와 함께 당신을 도울 수는 없지만, 흥미있는 SQL의 문제입니다 ...

무엇 RDMS? 아래는 MS SQL Server에서 작동합니다. 고유 한 값과 연결을 사용하여 x와 y를 연결할 때 고유 한 값의 수를 결정할 수 있습니다. x, y로 그룹화 할 때이 행 수가 같아야합니다.

select count(distinct CAST(x as char(10)) + CAST(y as char(10))) 
from tasks; 
+0

사실, 나는 내 질문에 subselect를 사용하여 SQL 솔루션을 가지고있다. JPA (및 QueryDSL)에이를 알려주는 방법에 문제가 있습니다. (저는 PostgreSQL을 사용하고 있습니다.) –

+0

그래서 실제로 줄을 연결 한 다음 결과에 "distinct"를 사용하여 총 수를 봅니다. QueryDSL에서 구현할 수 있는지, 실제로 모든 것을 검색하고 클라이언트 측에서 계산하는 것보다 실제로 빠르다면 시도해 보겠습니다. –

+0

수정하십시오. 연결하고 고유 한 값만 계산하십시오.나는 이것이 이상적인 해결책은 아니라고 인정하지만, from 절에서 하위 쿼리없이 집계 쿼리의 행 수를 찾는 데 어려움을 겪었습니다.이 쿼리는 QueryDSL에서 불가능하다고 말한 것입니다. 희망이 어떤 식 으로든 도움이됩니다. – KingOfAllTrades

관련 문제