이것은 기본적으로 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 쿼리입니다. 누구든지
은 관심 :
- NRP는 "표준화 된 순위 점"입니다. 이것은 게임에 따라 달성 할 수있는 최대 점수의 간단한 비율입니다. 10 경기를 치른 팀은 단 6 경기를 뛰었던 팀보다 훨씬 많은 총 포인트 (손실 당 1 포인트)를 얻었습니다. 실제 순위 표시기입니다. w와 g는 코드에서 설명합니다.
- SCF와 SCA는과 (
WHERE
필터링)에 대한 점수입니다
Q :
어떻게 JPQL에 당신 ORDER BY
같은 계산 된 속성합니까? 나는 꽤 자주 이것을 가지고 있지만, SELECT의 ... AS ...
은 유효하지 않은 JPQL (Hibernate가 처리 할 수있는 것) 인 것처럼 보입니다. 어떻게 이것을 일반적으로 해결합니까?