Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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_Hibernate_Orm_Hql - Fatal编程技术网

Java 在hibernate聚合函数中使用函数作为参数

Java 在hibernate聚合函数中使用函数作为参数,java,hibernate,orm,hql,Java,Hibernate,Orm,Hql,我想在HQL中执行以下查询: select count(distinct year(foo.date)) from Foo foo 但是,这会导致以下例外情况: org.hibernate.hql.ast.QuerySyntaxException: 应为关闭,在第行附近找到“(” 第27栏第1行 hibernate似乎不允许使用函数作为其聚合函数的参数。有什么方法可以得到所需的结果吗 选择整个日期 在结果上循环并从每个日期提取一个新的年度集合 一开始它听起来没什么效果,但后来它只是一个额外

我想在HQL中执行以下查询:

select count(distinct year(foo.date)) from Foo foo  
但是,这会导致以下例外情况:

org.hibernate.hql.ast.QuerySyntaxException: 应为关闭,在第行附近找到“(” 第27栏第1行

hibernate似乎不允许使用函数作为其聚合函数的参数。有什么方法可以得到所需的结果吗

  • 选择整个日期
  • 在结果上循环并从每个日期提取一个新的年度集合
  • 一开始它听起来没什么效果,但后来它只是一个额外的O(n),我想n并没有那么大

    另一种方法是使用本机SQL查询

  • 选择整个日期
  • 在结果上循环并从每个日期提取一个新的年度集合
  • 一开始它听起来没什么效果,但后来它只是一个额外的O(n),我想n并没有那么大


    另一种方法是使用本机SQL查询。

    带条件的API可以使用:

    这应该行得通,我还没有测试过


    sql投影的唯一问题是您必须知道(即重复)列名。

    带条件API可以使用:

    这应该行得通,我还没有测试过


    sql投影的唯一问题是您必须知道(即重复)列名。

    谢谢您的回答。但是,对于与第三方软件的兼容性问题,我希望能够在单个查询中完成。我想知道是否可以完成。使用本机sql查询(而不是HQL)谢谢你的回答。但是,关于与第三方软件的兼容性问题,我希望能够在一个查询中完成。我想知道是否可以完成。使用本机SQL查询(而不是HQL)感谢您指出使用hibernate投影的可能性。我将不得不更深入地研究它们!感谢您指出使用hibernate投影的可能性。我将不得不更深入地研究它们!我仍然有兴趣知道这是否只能在纯HQL中实现。我仍然有兴趣知道这是否可以在pur中实现e仅适用于HQL。
    String func = format("count(distinct year(%s_.date))", criteria.getAlias());
    String alias = "dateCol";
    session.createCriteria(Foo.class).setProjection(
        sqlProjection(
            format("%s as %s", func, alias),
                new String[] { alias }, 
                new Type[] { Hibernate.LONG }
             )
         )
     );