如何在 Date Spring Query DSL 中计算不同的年份?
Posted
技术标签:
【中文标题】如何在 Date Spring Query DSL 中计算不同的年份?【英文标题】:How to count distinct years in Date Spring Query DSL? 【发布时间】:2021-11-08 01:29:37 【问题描述】:当我通过这个查询计算不同年份的日期时
List count = queryFactory.select(qTestEntity.createdDate.year().countDistinct()).from(qTestEntity)
.fetch();
它给了我一个错误
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 27 [select count(distinct year(testEntity.createdDate))
from testEntity]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:725) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:113) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
at jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at com.sun.proxy.$Proxy111.createQuery(Unknown Source) ~[na:na]
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:101) ~[querydsl-jpa-4.3.1.jar:na]
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:94) ~[querydsl-jpa-4.3.1.jar:na]
at com.querydsl.jpa.impl.AbstractJPAQuery.fetch(AbstractJPAQuery.java:201)
经过调查,我发现了一个问题:- spring JPA @Query error, expecting CLOSE, found '(' near
是否有任何解决方法可以在没有本地查询的情况下获得不同的年份?
【问题讨论】:
【参考方案1】:Hibernate 并不支持所有日期提取功能,因为在 Hibernate 中没有开箱即用的功能。此外,Hibernate 似乎不支持对函数或参数化表达式进行 COUNT 不同的操作。
您可以考虑Blaze-Persistence Querydsl integration,它为 Hibernate 提供了更高级的聚合和日期提取功能。
【讨论】:
感谢@Jan-Willem Gmelig Meyling。我们可以用 GroupBy 做到这一点吗?请给我一个伪查询。以上是关于如何在 Date Spring Query DSL 中计算不同的年份?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?