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