นี่เป็นคำถามติดตามผลของ JPA/JPQL: AS identifier disallowed ใน SELECT clause โดยพื้นฐานแล้ว
นี่คือแบบสอบถาม 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 เกมมีจำนวนคะแนนรวมที่สูงกว่ามาก (ได้รับ 1 คะแนนต่อการสูญเสีย) มากกว่าทีมที่เล่นเพียง 6 เกม มันเป็นตัวบ่งชี้การจัดอันดับที่แท้จริง w และ g อธิบายไว้ในโค้ด
- scf และ sca เป็นคะแนนที่เข้าหรือออก (กรองใน
WHERE
)
ถาม:
คุณ ORDER BY
คุณสมบัติที่คำนวณดังกล่าวใน JPQL ได้อย่างไร ฉันมีสิ่งนี้ค่อนข้างบ่อย แต่เนื่องจาก ... AS ...
ใน SELECT ดูเหมือนว่าจะ JPQL ไม่ถูกต้อง (ไฮเบอร์เนตสามารถจัดการได้) โดยทั่วไปคุณจะแก้ไขปัญหานี้อย่างไร