仅将日期的日期部分与休眠中的时间戳进行比较

时间:2012-01-23 10:06:25

标签: java hibernate

我在数据库和应用程序中有时间戳我确实有日期。我喜欢以hibernate可以将所有条目与日期匹配的方式编写hibernate标准,而不是时间部分。 e.g。

<时间戳

中的

2011-12-01 15:14:14

并且在应用程序中我确实有java.util.Date,它默认具有时间部分。

我的问题是当我使用以下代码从数据库中搜索条目时我什么都没得到

    DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class);
    criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate));
    List entries =this.getHibernateTemplate().findByCriteria(criteria);

提前致谢

3 个答案:

答案 0 :(得分:13)

如果您正在寻找按日期范围过滤的一般用途(例如,从今天到明天)。 我这样用:

YourService.java

Date fromTimestamp = new Date();
Date toTimestamp = new Date();
Date fromDate = DateHelper.getDateWithoutTime(fromTimestamp);
Date toDate = DateHelper.getDateWithoutTime(DateHelper.getTomorrowDate(toTimestamp));

YourDAO.java

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, fromDate));
criteria.add(Restrictions.le(TIMESTAMP_FIELD, toDate));

DateHelper.java

public static Date getDateWithoutTime(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

public static Date getTomorrowDate(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DATE, 1);
    return cal.getTime();
}

当然 - 每个代码都有重构的空间。

答案 1 :(得分:4)

like运算符只能用于String值。它在约会时没有意义。

如果您的日期为2011-12-01(假设此处为yyyy-MM-dd),并且您希望所有在当天都有时间戳的行,那么您正在搜索时间戳所在的所有行>= 2011-12-01< 2011-12-02

因此,在您的日期添加1天(使用临时Calendar对象),并使用以下代码:

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate));
criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay));

答案 2 :(得分:1)

if (model.getFromDOE() != null) {
        criteria.add(Restrictions.ge("createdDate",
                getFormattedFromDateTime(model.getFromDOE())));
    }

    if (model.getToDOE() != null) {
        criteria.add(Restrictions.le("createdDate",
                getFormattedToDateTime(model.getToDOE())));
    }

private Date getFormattedFromDateTime(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    return cal.getTime();
}

private Date getFormattedToDateTime(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    return cal.getTime();
}