JPQL ORDER BY จากฟิลด์/นิพจน์จากการคำนวณ

นี่เป็นคำถามติดตามผลของ 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 ...

สำหรับใครที่สนใจ:

  1. nrp คือ "คะแนนอันดับปกติ" นี่เป็นเปอร์เซ็นต์ง่ายๆ ของจำนวนคะแนนสูงสุดที่ได้รับตามเกมที่เล่น ความเป็นมาคือทีมที่เล่นไป 10 เกมมีจำนวนคะแนนรวมที่สูงกว่ามาก (ได้รับ 1 คะแนนต่อการสูญเสีย) มากกว่าทีมที่เล่นเพียง 6 เกม มันเป็นตัวบ่งชี้การจัดอันดับที่แท้จริง w และ g อธิบายไว้ในโค้ด
  2. scf และ sca เป็นคะแนนที่เข้าหรือออก (กรองใน WHERE)

ถาม:

คุณ ORDER BY คุณสมบัติที่คำนวณดังกล่าวใน JPQL ได้อย่างไร ฉันมีสิ่งนี้ค่อนข้างบ่อย แต่เนื่องจาก ... AS ... ใน SELECT ดูเหมือนว่าจะ JPQL ไม่ถูกต้อง (ไฮเบอร์เนตสามารถจัดการได้) โดยทั่วไปคุณจะแก้ไขปัญหานี้อย่างไร


person Kawu    schedule 05.08.2012    source แหล่งที่มา


คำตอบ (1)


พบมัน. ดูเพิ่มเติมที่ http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#New_in_JPA_2.0 . โปรดทราบว่าตัวอย่าง ที่ 2 ถึงสุดท้าย ตรงนั้น

select_item ::= select_expression [[AS] result_variable]

อนุญาตให้ใช้ตัวเลือก AS ในการเลือก

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

ฉันไม่รู้ว่าสิ่งนี้ได้รับการสนับสนุนในนิพจน์คอนสตรัคเตอร์ด้วยหรือไม่ แต่ฉันไม่เห็นเหตุผลว่าทำไมจะไม่ทำเช่นนั้น

person Kawu    schedule 05.08.2012