如何在 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 集成 dsl 解组 xml

Query DSL

ES Query DSL

如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?

在 Apigee 中使用 Query DSL 库的经验

如何使用 Spring DSL 在骆驼中记录标头值