在 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 HQL 查询:如何将集合设置为查询的命名参数?