2014-02-12 2 views
1

매우 단순한 pure SQL 문을 criteria 쿼리로 다시 작성할 때 막혔습니다. 기본적으로 나는 기준. 가장 큰 두 개를 선택하십시오.

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery cq = cb.createQuery(); 

Root<T> fromT = cq.from(T.class); 
Root<S> fromS = cq.from(S.class); 

cq.where(cb.equal(fromT.get("id), fromS.get("id")); 

cq.select(); // <---- what to put here. 


getEntityManager().createQuery(cq).getResultList(); 
내가 큰 방법을 발견

을 시도

select max(T.value, S.value) from T, S where T.id = S.id 

내 쿼리를 단순화 할 수 있지만, 수평 비교 (열에서 값)와 나는 같은 행에서 두 값을 비교하고 싶습니다 그러나 다른 칼럼과 가장 큰 가치를 가진 하나를 얻으십시오.

내 마음에 오는 유일한 해결책은 결과를 가져 와서 '수동으로'정렬하는 것이지만 성능에 영향을 줄 수 있습니다.

답변

0

: 모든 가능의 경우 나는 또한 내부에이 변경 제안

SELECT 
    CASE 
    WHEN T.value < S.value THEN S.value 
    ELSE T.value 
    END 
FROM 
    T, S 
WHERE 
    T.id = S.id 

가입.

cb.selectCase(). 
    when(cb.greaterThanOrEqualTo(fromT.get("xValue"), fromS.get("yValue")), fromT.get("xValue")). //-- If T has max value 
    otherwise(fromS.get("yValue")); //-- Else, by default select value from S 
0

사례 명세서 만 사용할 수 있습니까? 당신은 아래의 경우 문을 시도 할 수 있습니다

SELECT 
    CASE 
    WHEN T.value < S.value THEN S.value 
    ELSE T.value 
    END 
FROM 
    T INNER JOIN S 
    ON T.id = S.id 
+0

괜찮 았지만 hbn 기준으로 코딩하는 방법은 무엇입니까? –

+0

글쎄, CriteriaBuilder 클래스는 [case statements를 지원합니다] (http://stackoverflow.com/a/5601260/2400222) [절을 표현식으로 사용할 수 있습니다] (http://wiki.eclipse.org/EclipseLink/) 개발/JPA_2.0/case_expressions). 죄송합니다. 귀하의 질문을 더 철저히 읽었을 지 모르지만이 자료가 도움이되기를 바랍니다. – Zec