2

これは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 ...です。

興味のある方へ:

  1. nrp は「正規化されたランキング ポイント」です。これは、プレイしたゲームに応じて獲得できる最大ポイント数の単純なパーセンテージです。背景として、10 ゲームをプレイしたチームは、6 ゲームしかプレイしていないチームよりも合計ポイント数がはるかに高くなります (1 敗ごとに 1 ポイントが与えられます)。それはTHE実際のランキング指標です。w と g はコードで説明されています。
  2. scf と sca は賛成と反対のスコアです ( でフィルタリングWHERE)

Q:

ORDER BYJPQLでどのようにプロパティを計算しますか? 私はこれをかなり頻繁に持っていますが... AS ...、 SELECT の は無効な JPQL (Hibernate はそれらを処理できる) のように見えるため、一般的にどのようにこれを解決しますか?

4

1 に答える 1

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

これがコンストラクター式でもサポートされているかどうかはわかりませんが、そうしない理由はわかりません。

于 2012-08-05T17:07:56.997 に答える