当前位置: 首页 > 面试题库 >

HQL中的日期运算

赖运珧
2023-03-14
问题内容

我想使用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查询中执行日期/时间数学。具体来说,如何从函数结果中增加或减少(x)时间?还是我必须为此使用SQL并希望正在运行的任何数据库都支持它? HQL查询示例: 我可以将:timeToSubtract参数定义为任何特定单位,尽管大于小时的值是不希望的,而秒数则是最理想的。 澄清:我意识到这可以在查询之外轻松完成。但是出于哲学原因,可以说使用数据库服务器的时间而不是查询系统

  • 问题内容: 我必须比较hibernatehql查询中的两个日期。我在我的Java bean中使用java.util.Date,并在MySQL数据库中将时间戳用作数据类型。 上面的查询将时间与日期进行比较。我应该怎么做才能在没有时间的情况下比较上述查询中的日期。 问题答案: 有关可用的日期功能,请参见Hibernate文档。 http://docs.jboss.org/hibernate/orm/3

  • 问题内容: 我有两个日期搜索字段,即从和到。我必须从用户表中检索其startDate位于在搜索字段中输入的起始和终止日期之间的记录,如果起始和终止日期为null,则必须从用户表中检索所有记录。 我尝试了以下hql查询: 在这里,start_flag的类型为int,如果from和to为null,则将其设置为1。 这里的数据类型是: startDt-java.util.Date endDt- java

  • 问题内容: 大家好,我有以下问题。我的MySQL数据库中有一个保留表,日期列定义为DATETIME。我需要使用hibernate进行查询以找到一天中的所有储备,无论是小时还是同一年的月份和日期,而我正在这样做 … 我真的不知道如何进行比较,并只带给我指定日期的信息,没有任何帮助吗? 问题答案: 我希望有一种与日期无关的将日期时间转换为日期的方法。通常,这就是我处理您的情况的方式。

  • 问题内容: 是否可以使用JPA / Hibernate执行日期算术?例如,我有一个带有java.util.Date字段的实体,该实体指示何时创建该行。是否可以使用JPQL执行查询并在该字段上包括日期算术?例如,我可以执行COUNT(*)行,然后在该字段中按月份分组吗?我是否可以执行其他功能,例如仅返回查询中该字段的月份或年份? 问题答案: HQL确实有日期这样的表达式,,,,,和,但标准JPQL不

  • 问题内容: 我有一张表(在Oracle 9及更高版本中),在这里我需要使用Hibernate查找给定日期的所有条目。这些条目具有时间戳(数据类型为“ date”)。一些条目有一个时间,其他条目只有一个日期。这不能更改,因为这是我无法更改的其他应用程序的输出。在SQL中,我会按照 获取我想要的日期的所有条目。我想知道如何让Hibernate使用HQL做到这一点。我知道我可以在Hibernate中使用