Hibernate HQL中的通用日期格式函数

时间:2017-12-08 16:35:51

标签: mysql spring postgresql hibernate hql

我有一个用 HQL 编写的查询用于JpaRepository类,它曾经看起来像那样,并且只要我们依赖 MySQL / MariaDB 就可以工作:

@Query("SELECT label, DATE_FORMAT(creationTimestamp, 'dd/mm/yyy'), count(*) "
      + "FROM Event "
      + "WHERE ..."
      + "GROUP BY DATE_FORMAT(creationTimestamp, 'dd/mm/yyyy')")

但是,我们现在还需要支持 PostgreSQL ,其中DATE_FORMAT()函数不存在,而是TO_CHAR()

但不幸的是,我们不能同时拥有这两者,而我们最不希望的是必须分叉我们的代码库以支持两个DBMS。

有没有办法从HQL中的通用日期格式中受益,而无需直接调用正在使用的DBMS的底层函数?

1 个答案:

答案 0 :(得分:0)

不幸的是,在Hibernate中没有开箱即用的支持(不确定为什么容易实现)。

您可以通过扩展方言来完成这项工作。这很简单,它将创建一个通用的HQL函数,使您的应用程序数据库不可知。

首先,为您要扩展的方言创建一个类,例如:

class ExtendedPostgreSQL9Dialect extends PostgreSQL9Dialect {
    ExtendedPostgreSQL9Dialect() {
        // Add a generic 'date_format' function that can be used across databases
        registerFunction("date_format", new SQLFunctionTemplate(StandardBasicTypes.DATE, "to_char(?1, ?2)"));
    }
}

然后将您的数据源更改为使用自定义方言,例如,通过更改hibernate.cfg.xml:

<property name="hibernate.dialect">com.mycompany.dialect.ExtendedPostgreSQL9Dialect</property>

然后您可以在HQL中使用DATE_FORMAT(MYDATE,'YYYY-MM-DD')