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

我问是因为我需要根据一张表“违规”中的数据实现一些简单的统计数据

以下是我的想法:

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

结果表:

  • 国家 varchar(20),
  • 网站 varchar(20),
  • 长时间怀疑违反,
  • 确认违规时间长,
  • Confirm_no_violation long,
  • not_determined long,
  • 总长

我的结果表需要前两列(contry 和 site)来自第一个表“Violations”,接下来的 5 列将包含 Status 表中每个可能的 id 值中“Violations”中出现的 status_id 的数量(计数)。

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

违规行为:

  • 身份证长,
  • 国家 varchar(20),
  • 网站 varchar(20),
  • status_id long, <--这是状态表中的状态id。
  • ...在这种情况下其他列不重要

地位:

  • 身份证长,
  • status long 列“status”具有映射到字符串值的值 (1-4):Suspected Violation (1)、Confirmed Violation (2)、Confirmed No Violation (3)、未确定 (4)

我加入的结果是拥有应该包含列的表:

  • 来自违规表:“国家/地区”和“网站”
  • 来自状态表:“怀疑违规”、“确认违规”、“确认无违规”、“未确定”、“总计”(其中此列是违规表中出现的计数器)。

更新:据我所知,现在不需要使用连接,查询只能在一张表上运行。

您能建议我在 JPA/Hibernate 中执行此操作的正确方法是什么吗?

4

2 回答 2

0

你必须使用

session.createSQLQuery 

并且可以使用下面的方法将 sql 结果转换为您需要的 bean

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

或者您可以使用投影

于 2013-03-11T18:28:21.597 回答
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语句中创建的对象列表。

于 2013-03-12T12:33:02.763 回答