Mat*_*ock 10
根据您的数据库,这可能非常简单.HQL支持内置的特定于供应商的特性和功能,它还支持通过在HQL尚不支持的情况下注册新功能来扩展方言.
假设您正在使用SQLServer(或Sybase).SQLServer有一个名为"DATEADD"的函数,可以非常轻松地执行您喜欢的操作.格式为:
DATEADD (datepart, number, date)
Run Code Online (Sandbox Code Playgroud)
您可以直接在HQL中使用此函数,方法是首先在您自己的Hibernate方言中注册该函数.要做到这一点,您只需要扩展您当前使用的Dialect.这是一个非常简单的过程.
首先,创建自己的方言类(用您自己的数据库供应商替换'SQLServer2008Dialect'):
public class MySQLServerDialect extends SQLServer2008Dialect {
public MySQLServerDialect() {
registerFunction("addminutes", new VarArgsSQLFunction(TimestampType.INSTANCE, "dateadd(minute,", ",", ")"));
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,修改您的hibernate配置以使用这个新类:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
...
<property name="hibernate.dialect">com.mycompany.MySQLServerDialect</property>
...
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
现在只需使用该功能:
select x from MyEntity x where addminutes(x.creationDate, 10) < current_time()
Run Code Online (Sandbox Code Playgroud)
(这假设您的实体名为MyEntity,creation_date字段映射到名为creationDate的属性).