2013-03-11 23 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