2013-03-11 22 views
2

是否有可能在JPA/Hibernate中運行如下所示的查詢?如何在JPA/Hibernate中使用集合函數調用SQL查詢

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數據庫中,但是當我使用JPA/Hibernate的我越來越:

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

我問,因爲我需要實現一些簡單的統計根據一個表中的數據「違規」

以下是我的想法:

我需要連接兩個表,並從第二個表計出現一些值來實現類似的統計數據表的效果,這將有列:

結果表:

  • 國家VARCHAR(20),
  • 站點VARCHAR(20),
  • suspected_violation長,
  • confirmed_violation長,
  • confirmed_no_vio特徵研長,
  • not_determined長,
  • 總長

我的結果表需要有前兩列(contry與本站)來自第一表「違規」和未來5列將包含數字(計數)在來自狀態表的每個可能的id值中的「Violations」中發生的status_id。

所以,我有兩個表:違規和狀態。

違規:

  • ID長,
  • 國家VARCHAR(20),
  • 網站VARCHAR(20),
  • STATUS_ID長,< - 這是在狀態的狀態標識表。
  • ...其他列在這種情況下

狀態並不重要:

  • ID長,其分別對應的字符串值
  • 狀態長 列「身份」具有值(1-4):涉嫌違反(1),確認衝突(2),確認無衝突(3)中,未測定(4)

在我的結果是加入具有表,該表應包含列:

  • 從違規表:「國家」和「網站」
  • 從狀態表:「涉嫌違反」,「確認衝突」,「確認不違規」,「未確定」,「總」(其中本列是違規表中出現的計數器)。

更新:據我所知現在沒有必要使用連接,查詢可以只在一個表上運行。

你能告訴我在JPA/Hibernate中做什麼的正確方法是什麼?

+0

在JPA中,您可以使用createNativeQuery – Eelke 2013-03-11 20:25:53

回答

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(); 

結果是通過休眠創建的對象列表SELECT new語句。

0

你必須使用

session.createSQLQuery 

,可以使用下面的方法將SQL結果轉換到你所需要的bean

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

,或者你可以同時使用Projections