在 Hibernate 命名查询中根据参数选择分组

Posted

技术标签:

【中文标题】在 Hibernate 命名查询中根据参数选择分组【英文标题】:Chose grouping based on parameter in Hibernate named query 【发布时间】:2015-05-04 19:39:56 【问题描述】:

我有一个在 XML 配置中定义的 Hibernate 命名查询。

查询会生成有关个人人口统计信息的汇总报告。我们住的地方,那个人可能住在一个省或县。

我想知道是否可以根据休眠查询参数按省或县聚合查询。

这是我尝试过的:

SELECT to_char(case when :groupReportBy = 'province' then PROVINCE else COUNTY end),
     COUNT(distinct PERSON_TABLE.PERSON_ID) as personReport.numOfPeople
     --, There are some other aggregation things that happen here as well
FROM 
  PERSON_TABLE PI
WHERE
  PI.BDATE >= date '2014-01-01' and PI.BDATE <= date '2014-12-31'
GROUP BY 
  case when :groupReportBy = 'province' then PROVINCE else COUNTY end);

参数名称为:groupReportBy。如果我硬编码“省”而不是参数名称,则此查询将起作用,但如果我按照上面显示的方式运行它,则会收到以下错误:

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:

我从我的 Java 代码中执行查询,如下所示:

private List getReport (String namedQuery, String groupReportBy) 

    Session session = sessionFactory.getCurrentSession();
    Query query = session.getNamedQuery(namedQuery);

    query.setParameter("reportBy", reportBy);

    return query.list();

我正在使用 Oracle 数据库。

我真的不希望使用 Criteria API 重新编写这些查询。它们实际上非常长,而且数量很多。

有没有办法在 SQL 中做到这一点?

【问题讨论】:

我会在查询末尾删除额外的右括号(可能是to_char片段中的copy/paste剩余部分在select)。 【参考方案1】:

我从未使用组参数对其进行过测试,但我认为它的行为与 JPQL / HQL 查询的其他部分相同。 NamedQueries 是预编译的,因此以后不能更改,除了参数。

我花了 2 分钟查看 JPA 规范,但没有找到可以在运行时修改的确切定义。因此,以下内容可能不是 100% 正确,但对您来说应该足够了。

JPQL/HQL 关键字和模型对象属性在 NamedQuery 运行期间不能更改,原因可能是查询被转换为基于对象的表示。因此,您有必要编写一个标准的 JPQL/HQL 查询。

【讨论】:

以上是关于在 Hibernate 命名查询中根据参数选择分组的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 上更复杂的命名查询

更改分组时Hibernate中查询的不同返回类型

Hibernate HQL 查询:如何将集合设置为查询的命名参数?

Hibernate 命名查询和 Spring Data SQL 注入

带输入参数的命名查询

Hibernate(十三):HQL查询