说明:
date_add函数的原型:date_add(time, interval duration MINUTE)

问题:
由于项目中要用到时间来过滤一部分信息,因此用到了date_add这样的SQL原生函数,但Hibernate的HQL语句中并不支持date_add函数的使用。

解决方法:
扩展org.apache.dialect.MySQLDialect类,因为Hibernate中HQL的函数是通过这个类来实现和SQL原生函数之间映射的。具体方法是定义一个MySQLDialect的子类ExtendedMySQLDialect,具体内容如下:

package org.hibernate.dialect;
import org.hibernate.Hibernate;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
public class ExtendedMySQLDialect extends MySQLDialect {
/*
* 使用方式 date_add(now(), 1, WEEK)
*/
public ExtendedMySQLDialect() {
super();
registerFunction("date_add", new SQLFunctionTemplate(Hibernate.DATE,
"date_add(?1, INTERVAL ?2 ?3)"));
}
}



将这个类编译好的class文件放到hibernate.jar包中,这样就可以使用date_add函数了。因为项目中用到了Spring框架来管理sessionFactory,所以还要对应的修改sessionFactory的dialect属性为新扩展的ExtendedMySQLDialect类,这样就可以在工程中通过HQL使用date_add函数了。


在HQL中这样用:date_add函数的原型:date_add(now(), 1, WEEK)