当前位置: 首页 > 知识库问答 >
问题:

在Hibernate命名查询中选择基于参数的分组

刁瀚昂
2023-03-14

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

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

我想知道是否有可能根据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();
}

我使用的是甲骨文数据库。

我真的不想使用Criteria API重写这些查询。它们实际上超级长,而且数量很多。

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

共有1个答案

邵骁
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 使用Hibernate时,有什么方法可以在命名查询中指定可选参数(例如,从表单提供搜索参数而并非所有参数都是必需的)?我正在使用本机SQL查询,但该问题可能也适用于命名HQL查询。 我很确定对此的答案是“否”,但是我还没有在文档中找到确切的答案。 问题答案: AFAIK,没有这样的事情,因此您必须为此编写一个动态查询。也许看一下以前的答案,该答案显示了如何在HQL中执行此操作(您可以将

  • 错误:运算符不存在:uuid=bytea 有什么建议吗?

  • 问题内容: 谁能指出我如何将order by子句作为命名参数传递给HQL? 有效的示例: 无效的示例: 问题答案: 不支持,只能在and 子句中使用输入参数,并且不能为子句使用参数。或者,如果我改写,您不能对列使用参数,只能对值使用。因此,要么: 有尽可能多的命名查询排序顺序 将排序字符串连接到查询字符串 使用条件查询

  • 问题内容: Microsoft(和许多开发人员)声称SqlDataReader.GetOrdinal方法与使用命名查找即使用DataReader相比,提高了从DataReader检索值的性能。reader [“ ColumnName”]。问题是,如果处理小的分页记录集,那么 真正的 性能差异是什么?在整个代码中查找和引用序数索引是否值得付出额外的开销? 问题答案: Microsoft建议不要在循环

  • 问题内容: 我对Hibernate Native Query有问题。我有一个选择,它选择数组切片(PostgreSQL数据库)。 问题在于hibernate状态识别以下部分:来自“ SELECT my_array [1:300] …”的“:300”作为命名参数,并且我得到以下异常:尚未设置所有命名参数。 我试图用’:’,’::’逃脱冒号(:),但没有成功。 Hibernate版本是3.2 问题答案