HQL中的日期运算

我想使用HQL从表中获取过期的实体。像这样:

select id, name from entity_table where date_creation + 10_minutes < current_time()

我无法使用HQL做到这一点。我不想做额外的查询,在Java代码中处理日期等等。这必须在HQL级别上完成。

你能帮我么?

回答:

根据您的数据库,这可能非常简单。HQL支持内置的特定于供应商的特性和功能,如果HQL不支持新功能,它还支持通过注册新功能来扩展方言的功能。

假设您使用的是SQLServer(或Sybase)。SQLServer具有一个名为“ DATEADD”的函数,可以很轻松地完成您喜欢的事情。格式为:

DATEADD (datepart, number, date)

您可以在HQL中直接使用此功能,方法是先在自己的Hibernate方言中注册该功能。为此,您只需要扩展当前使用的方言即可。这是一个非常简单的过程。

首先,创建您自己的方言类(用您自己的数据库供应商替换“ SQLServer2008Dialect”):

public class MySQLServerDialect extends SQLServer2008Dialect {

public MySQLServerDialect() {

registerFunction("addminutes", new VarArgsSQLFunction(TimestampType.INSTANCE, "dateadd(minute,", ",", ")"));

}

}

接下来,修改您的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>

现在只需使用函数:

select x from MyEntity x where addminutes(x.creationDate, 10) < current_time()

(这假设您的实体称为MyEntity,并且creation_date字段映射到名为creationDate的属性)。

以上是 HQL中的日期运算 的全部内容, 来源链接: utcz.com/qa/422539.html

回到顶部