Java 如何在JPA/Hibernate中使用聚合函数调用SQL查询
可以在JPA/Hibernate中运行下面这样的查询吗Java 如何在JPA/Hibernate中使用聚合函数调用SQL查询,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,可以在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
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
或
这在Oracle DB中有效,但当我使用JPA/Hibernate时,我得到:
ERROR [PARSER] line 1:311: unexpected token: total
ERROR [PARSER] line 1:375: unexpected token: ON
我这样问是因为我需要基于一个表“违规”中的数据实现一些简单的统计
以下是我的想法:
我需要连接两个表,并从第二个表中计算一些值,以实现类似于统计表的效果,该统计表将具有列:
结果表:
- 瓦查尔国家(20)
- 现场varchar(20)
- 怀疑违反了"条例",
- 确认了长时间的违规行为
- 确认无长时间违规
- 没多久
- 总长度
- 我很长
- 瓦查尔国家(20)
- 现场varchar(20)
- status_id long,您必须使用
并且可以使用下面的方法将sql结果转换为所需的beansession.createSQLQuery
query.setResultTransformer(Transformers.aliasToBean(YourBean.class))
或者你可以使用谢谢你的建议,同时我也用这种方式解决了这个问题: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();
List result=em.createQuery( “选择新的违规汇总数据(v.ConName,v.siteNumber,”+ sum(当v.pvClStati.clstId=1,然后1或0结束时的情况)被视为可疑违规+ “总和(当v.pvClStati.clstId=2时,则为1,否则为0结束)作为确认”+ “总和(当v.pvClStati.clstId=3时,则为1,否则为0结束)作为已确认的无效”+ 未确定的总和(当v.pvClStati.clstId=0时为1,否则为0结束)+ “将(*)计为总数”+ “来自违反v”+ “其中v.trial.id=“+trialId+ “按v.conName、v.siteNumber分组”,ViolationSummaryDTO.class).getResultList();
结果是hibernate在SELECT new语句中创建的对象列表。在JPA中,您可以使用createNativeQueryList<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();