Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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 根据Hibernate命名查询中的参数选择分组_Java_Sql_Oracle_Hibernate - Fatal编程技术网

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

Java 根据Hibernate命名查询中的参数选择分组,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,我在XML配置中定义了一个名为Hibernate的查询 该查询生成有关个人人口统计信息的汇总报告。在我们居住的地方,那个人可以住在一个省或一个县 我想知道是否可以根据hibernate查询参数按省或县聚合查询 以下是我尝试过的: SELECT to_char(case when :groupReportBy = 'province' then PROVINCE else COUNTY end), COUNT(distinct PERSON_TABLE.PERSON_ID) as {pe

我在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);
我从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数据库

我真的不想使用CriteriaAPI重新编写这些查询。它们实际上是超级长的,而且有很多


在SQL中有这样做的方法吗?

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

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


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

首先,我要删除查询末尾额外的右括号(可能是
select
中从
复制/粘贴到\u char
片段的剩余部分)。
private List getReport (String namedQuery, String groupReportBy) {

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

    query.setParameter("reportBy", reportBy);

    return query.list();
}