Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPA/Hibernate中使用聚合函数调用SQL查询_Java_Sql_Hibernate_Jpa - Fatal编程技术网

Java 如何在JPA/Hibernate中使用聚合函数调用SQL查询

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

可以在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

这在Oracle DB中有效,但当我使用JPA/Hibernate时,我得到:

ERROR [PARSER] line 1:311: unexpected token: total
ERROR [PARSER] line 1:375: unexpected token: ON
我这样问是因为我需要基于一个表“违规”中的数据实现一些简单的统计

以下是我的想法:

我需要连接两个表,并从第二个表中计算一些值,以实现类似于统计表的效果,该统计表将具有列:

结果表:

  • 瓦查尔国家(20)
  • 现场varchar(20)
  • 怀疑违反了"条例",
  • 确认了长时间的违规行为
  • 确认无长时间违规
  • 没多久
  • 总长度
我的结果表需要有前两列(contry和site)来自第一个表“违规”,接下来的5列将包含状态表id的每个可能值中“违规”中出现的状态id的数量(计数)

所以,我有两个表:违规和状态

违规行为:

  • 我很长
  • 瓦查尔国家(20)
  • 现场varchar(20)
  • status_id long,您必须使用

    session.createSQLQuery 
    
    并且可以使用下面的方法将sql结果转换为所需的bean

    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中,您可以使用createNativeQuery
    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();