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

时间:2011-09-20 09:45:35

标签: java jpa jpql

对于mysql,我写了一个像

这样的查询
SELECT * FROM mytable GROUP BY DATE(dateTimeField)

但我不能在JPQL中使用DATE()函数。 任何人都知道如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

对于Hibernate:

建议1:

使用cast(dateTimeField as date)。请参阅here

建议2:

您可以尝试连接yearmonthyear HQL expressions

查看this testcase的第360行。

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

但是花点时间看看生成的SQL,它可能(也可能会)丑陋而且速度慢。

答案 1 :(得分:2)

如果你在底层使用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)
    

答案 2 :(得分:1)

如果您使用的是EclipseLink,可以使用JPQL中的FUNC()函数来调用特定的数据库函数:

  

<强> Support for Native Database Functions Using FUNC

答案 3 :(得分:0)

我担心这超出了JPQL提供的范围。您将不得不诉诸本机查询。

以下是JPQL中的可用功能列表:

  

Java EE Tutorial 6 > Persistence > JPQL > Functional Expressions