Ini adalah pertanyaan lanjutan untuk JPA/JPQL: pengidentifikasi AS tidak diizinkan di Klausa SELECT pada dasarnya.
Inilah kueri 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
Pernyataan ini sama dengan pertanyaan sebelumnya tanpa ekspresi ... AS ...
.
Bagi siapa pun yang tertarik:
- nrp adalah "poin peringkat yang dinormalisasi". Ini adalah persentase sederhana dari jumlah poin maksimum yang dapat dicapai berdasarkan permainan yang dimainkan. Latar belakangnya adalah, tim yang memainkan 10 pertandingan memiliki jumlah total poin yang jauh lebih tinggi (ada 1 poin yang diberikan setiap kekalahan) dibandingkan tim yang hanya memainkan 6 pertandingan. Ini adalah indikator peringkat sebenarnya. w dan g dijelaskan dalam kode.
- scf dan sca adalah skor yang mendukung dan menentang (disaring dalam
WHERE
)
T:
Bagaimana Anda ORDER BY
properti terhitung seperti itu di JPQL? Saya cukup sering mengalami ini, tetapi karena ... AS ...
dalam SELECT tampaknya JPQL tidak valid (Hibernate dapat menanganinya), bagaimana biasanya Anda menyelesaikannya?