我有一个用 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的底层函数?
答案 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')