2

JPA/Hibernate で以下のようなクエリを実行することは可能ですか?

select v.country,
v.site,
    SUM(case when s.id = 1 then 1 else 0 end) as Total_SuspectedViolations,
    SUM(case when s.id = 2 then 1 else 0 end) as Total_ConfirmedViolations,
    SUM(case when s.id = 3 then 1 else 0 end) as Total_ConfirmedNoViolations,
    SUM(case when s.id = 4 then 1 else 0 end) as Total_NotDetermined,
    COUNT(*) Total
from violations v
inner join status s
    on v.status_id = s.id
group by v.country, v.site

また

select v.country,
v.site,
    SUM(case when v.status_id = 1 then 1 else 0 end) as Total_SuspectedViolations,
    SUM(case when v.status_id = 2 then 1 else 0 end) as Total_ConfirmedViolations,
    SUM(case when v.status_id = 3 then 1 else 0 end) as Total_ConfirmedNoViolations,
    SUM(case when v.status_id = 4 then 1 else 0 end) as Total_NotDetermined,
    COUNT(*) Total
from violations v
group by v.country, v.site

これは Oracle DB で機能しますが、JPA/Hibernate を使用している場合は次のようになります。

ERROR [PARSER] line 1:311: unexpected token: total
ERROR [PARSER] line 1:375: unexpected token: ON

1つのテーブル「違反」のデータに基づいていくつかの簡単な統計を実装する必要があるため、私は尋ねています

以下は私の考えです:

列を持つ統計テーブルのような効果を得るには、2 つのテーブルを結合し、2 番目のテーブルのいくつかの値の発生をカウントする必要があります。

結果表:

  • 国 varchar(20),
  • サイト varchar(20)、
  • pseudo_violation ロング、
  • confirmed_violation ロング、
  • confirmed_no_violation ロング、
  • not_determined ロング、
  • トータルロング

私の結果テーブルには、最初のテーブル「違反」からの最初の 2 つの列 (国とサイト) が必要であり、次の 5 つの列には、ステータステーブルからの id の可能な値のそれぞれで、「違反」の status_id の発生数 (カウント) が含まれます。

そのため、既存の 2 つのテーブルがあります: Violations と Status です。

違反:

  • IDロング、
  • 国 varchar(20),
  • サイト varchar(20)、
  • status_id long、<-- これはステータス テーブルのステータスの ID です。
  • ... この場合、他の列は重要ではありません

状態:

  • IDロング、
  • status long 列「ステータス」には、文字列値にマッピングされる値 (1 ~ 4) があります。

私の結合の結果は、列を含む必要があるテーブルを持つことです:

  • 違反表から: 「国」および「サイト」
  • ステータス テーブルから: 「違反の疑い」、「違反の確認」、「違反なしの確認」、「未決定」、「合計」(この列は、違反テーブルの発生回数のカウンターです)。

更新:私が知る限り、結合を使用する必要はありません。クエリは1つのテーブルでのみ実行できます。

JPA/Hibernateでそれを行う適切な方法は何ですか?

4

2 に答える 2

0

その間、私はこの方法でそれを解決しました:提案をありがとう:

List<ViolationSummaryDTO> result = em.createQuery(
                "SELECT new ViolationSummaryDTO(v.counName, v.siteNumber," +
                    "sum(case when v.pvClStati.clstId = 1 then 1 else 0 end) as suspectedViolation," +
                    "sum(case when v.pvClStati.clstId = 2 then 1 else 0 end) as confirmedViolation," +
                    "sum(case when v.pvClStati.clstId = 3 then 1 else 0 end) as confirmedNoViolation," +
                    "sum(case when v.pvClStati.clstId = 0 then 1 else 0 end) as notDetermined," +
                    "COUNT(*) as total)" +
                " FROM Violation v" +
                " WHERE v.trial.id = " + trialId +
                " GROUP BY v.counName, v.siteNumber", ViolationSummaryDTO.class).getResultList();

結果は、 SELECTnewステートメントで休止状態によって作成されたオブジェクトのリストです。

于 2013-03-12T12:33:02.763 に答える
0

使用する必要があります

session.createSQLQuery 

以下のメソッドを使用して、SQL結果を必要なBeanに変換できます

query.setResultTransformer(Transformers.aliasToBean(YourBean.class))

またはProjectionsを使用できます

于 2013-03-11T18:28:21.597 に答える