如何在hibernate标准中使用date()

时间:2012-04-01 15:22:01

标签: java mysql hibernate

我想在hibernate标准中使用Date()函数,因为一个字段是时间戳。

我的sql将是:

"select * from feed where DATE(date) = DATE(NOW()) + INTERVAL 5 DAY"

当我尝试标准时:

critera.add(Restrictions.eq("DATE(date)", "DATE(NOW()) + INTERVAL 5 DAY"));

我明白了:

could not resolve property: DATE(date) of: com.mycomapany.model.Feed

我在那里用名称日期提供了一个字段。

有什么问题?我正在使用MySQL

3 个答案:

答案 0 :(得分:4)

最佳解决方案是使用您开始使用的标准api。

Calendar c = Calendar.getInstance(LOCALIZATION);
//Add 5 Days
c.add(Calendar.DATE, 5);
criteria.add(Expression.ge("dateColumn",c.getTime());

答案 1 :(得分:1)

你可能会找到一种方法来完成这项工作,但在我看来,这是接近它的错误方法。

Hibernate的一个主要功能是通过Hibernate Dialect抽象出数据库供应商特有的功能。

您正试图直接访问MySQL功能,但通过供应商中立的界面,因此您的难度。 Hibernate可以支持日期间隔,但不支持 - 请参阅https://hibernate.onjira.com/browse/HHH-2434

所以,选项似乎是:

  • 计算代码中的日期范围,而不是HQL
  • 在SQL而不是HQL中执行您需要执行的操作
  • 创建自定义Hibernate Dialect,如Performing Date/Time Math In HQL?

答案 2 :(得分:1)

使用Joda Time

public List<Feed> findByDaysFromToday(int daysFromToday) {
    return em.createQuery(
            "SELECT f FROM Feed f WHERE f.date BETWEEN :start AND :end")
            .setParameter("start",
                          new LocalDate()
                                  .toDateMidnight()
                                  .toDate(),
                          TemporalType.DATE)
            .setParameter("end",
                          new LocalDate().plusDays(daysFromToday)
                                  .toDateMidnight()
                                  .toDateTime()
                                  .minusMillis(1)
                                  .toDateTime()
                                  .toDate(),
                          TemporalType.DATE)
            .getResultList();
}