これはJPA/JPQLへのフォローアップの質問です: AS 識別子は基本的に SELECT 句では許可されていません。
JPQL クエリは次のとおりです。
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 ...
です。
興味のある方へ:
- nrp は「正規化されたランキング ポイント」です。これは、プレイしたゲームに応じて獲得できる最大ポイント数の単純なパーセンテージです。背景として、10 ゲームをプレイしたチームは、6 ゲームしかプレイしていないチームよりも合計ポイント数がはるかに高くなります (1 敗ごとに 1 ポイントが与えられます)。それはTHE実際のランキング指標です。w と g はコードで説明されています。
- scf と sca は賛成と反対のスコアです ( でフィルタリング
WHERE
)
Q:
ORDER BY
JPQLでどのようにプロパティを計算しますか? 私はこれをかなり頻繁に持っていますが... AS ...
、 SELECT の は無効な JPQL (Hibernate はそれらを処理できる) のように見えるため、一般的にどのようにこれを解決しますか?