JPQL ORDER BY dari bidang terhitung/ekspresi

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:

  1. 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.
  2. 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?


person Kawu    schedule 05.08.2012    source sumber


Jawaban (1)


Menemukannya. Lihat juga http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#New_in_JPA_2.0 . Perhatikan, contoh kedua hingga terakhir di sana.

select_item ::= select_expression [[AS] result_variable]

Mengizinkan opsi AS di pilih.

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

Saya tidak tahu apakah ini juga didukung dalam ekspresi konstruktor, tapi saya tidak melihat alasan mengapa tidak melakukannya.

person Kawu    schedule 05.08.2012