如何仅从 JPQL 中的日期时间字段按日期进行分组

问题描述 投票:0回答:4

对于 mysql,我写了一个类似的查询

SELECT * FROM mytable GROUP BY DATE(dateTimeField)

但是我无法使用JPQL中的

DATE()
函数。 有人知道如何解决这个问题吗?

java jpa jpql
4个回答
3
投票

如果您在后台使用 Hibernate,您可以尝试:

  1. 使用自定义功能创建您自己的方言

    public class CustomPostgresqlDialect extends PostgreSQLDialect {   
        public CustomPostgresqlDialect() {
            super();
            registerFunction("truncate_date",
            new SQLFunctionTemplate( StandardBasicTypes.TIMESTAMP, "DATE(?1)" ));
        }
    }
    
  2. persistence.xml

    中注册您的方言
    <property name="hibernate.dialect" value="my.own.CustomPostgresqlDialect"/>
    
  3. 在 JPQL 中使用您的函数。

    select p from Post p group by truncate_date(p.dateCreated)
    

3
投票

对于休眠:

建议1:

使用

cast(dateTimeField as date)
。请参阅此处

建议2:

您可以尝试连接

year
month
year
HQL 表达式

看一下这个测试用例的第360行。

str(year(current_date))||'-'||str(month(current_date))||'-'||str(day(current_date))

但是花点时间看看生成的 SQL,它可能(并且可能会)丑陋且缓慢。


1
投票

如果您使用 EclipseLink,您可以使用 JPQL 中的

FUNC()
函数来调用特定的数据库函数:

使用 FUNC 支持本机数据库函数


0
投票

恐怕这超出了 JPQL 提供的范围。您将不得不求助于本机查询。

这是 JPQL 中可用函数的列表:

Java EE 教程 6 > 持久性 > JPQL > 函数表达式

© www.soinside.com 2019 - 2024. All rights reserved.