2012-08-05 4 views
1

이것은 기본적으로 JPA/JPQL: AS identifier disallowed in SELECT clause의 후속 질문입니다.계산 된 필드/표현식의 JPQL ORDER BY

SELECT NEW com.domain.project.view.StandingsStatLine(
     ro.id 
    , cl.name 
    , te.ordinalNbr + 1 
    , pa.wasWithdrawn 
    , SUM(CASE WHEN paf.wasWithdrawn = FALSE AND paa.wasWithdrawn = FALSE AND scf.finalScore IS NOT NULL THEN 1 ELSE 0 END)  // g = games 
    , SUM(CASE WHEN paf.wasWithdrawn = FALSE AND paa.wasWithdrawn = FALSE AND scf.finalScore > sca.finalScore THEN 1 ELSE 0 END) // w = wins 
    , SUM(CASE WHEN paf.wasWithdrawn = FALSE AND paa.wasWithdrawn = FALSE AND scf.finalScore < sca.finalScore THEN 1 ELSE 0 END) // l = losses 
    , ... 
    , <very complex multi-line expression> // nrp = normalized ranking points 
    ) 
    FROM Club cl 
    JOIN cl.teams te 
    JOIN te.rosters ro 
    JOIN ro.season se 
    JOIN ro.participations pa 
    JOIN pa.group gr 
    JOIN gr.round rd 
    JOIN rd.subCompetition sc 
    JOIN sc.competition cn 
    JOIN gr.games ga 
    JOIN ga.scores scf 
    JOIN ga.scores sca 
    JOIN scf.roster rof 
    JOIN sca.roster roa 
    JOIN rof.participations paf 
    JOIN roa.participations paa 
    WHERE ... 
    GROUP BY ... 
    ORDER BY pa.wasWithdrawn, nrp DESC, w DESC, g DESC, cl.shorthand 

... AS ... 표현하지 않고 이전 질문 와 동일 문은 다음과 같습니다

다음은 JPQL 쿼리입니다. 누구든지

은 관심 :

  1. NRP는 "표준화 된 순위 점"입니다. 이것은 게임에 따라 달성 할 수있는 최대 점수의 간단한 비율입니다. 10 경기를 치른 팀은 단 6 경기를 뛰었던 팀보다 훨씬 많은 총 포인트 (손실 당 1 포인트)를 얻었습니다. 실제 순위 표시기입니다. w와 g는 코드에서 설명합니다.
  2. SCF와 SCA는과 (WHERE 필터링)에 대한 점수입니다

Q :

어떻게 JPQL에 당신 ORDER BY 같은 계산 된 속성합니까? 나는 꽤 자주 이것을 가지고 있지만, SELECT의 ... AS ...은 유효하지 않은 JPQL (Hibernate가 처리 할 수있는 것) 인 것처럼 보입니다. 어떻게 이것을 일반적으로 해결합니까?

답변

1

발견. 또한 http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#New_in_JPA_2.0을 참조하십시오. 참고, 두 번째 마지막으로 예제가 있습니다.

select_item ::= select_expression [[AS] result_variable] 

select에서 AS 옵션을 허용합니다. 이 역시 생성자 표현식에서 지원되는 경우

SELECT AVG(e.salary) AS s, 
    e.address.city 
FROM Employee e 
GROUP BY e.address.city 
ORDER BY s 

는 나도 몰라,하지만 난 그렇게하지 말아야 할 이유에 이유를 볼 수 없습니다.