Java 比较日期';在Hibernate中,s日期部分仅带有时间戳
我在数据库中有时间戳,在应用程序中有日期。我喜欢编写hibernate标准,这样hibernate可以提取所有与日期匹配的条目,而不是时间部分。 e、 g 以DB为单位的时间戳 2011-12-01 15:14:14 在应用程序中,我有java.util.Date,它默认有时间部分 我的问题是,当我用下面的代码从数据库中搜索条目时,什么也得不到Java 比较日期';在Hibernate中,s日期部分仅带有时间戳,java,hibernate,Java,Hibernate,我在数据库中有时间戳,在应用程序中有日期。我喜欢编写hibernate标准,这样hibernate可以提取所有与日期匹配的条目,而不是时间部分。 e、 g 以DB为单位的时间戳 2011-12-01 15:14:14 在应用程序中,我有java.util.Date,它默认有时间部分 我的问题是,当我用下面的代码从数据库中搜索条目时,什么也得不到 DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class);
DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class);
criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate));
List entries =this.getHibernateTemplate().findByCriteria(criteria);
提前感谢like运算符只能用于字符串值。约会没有意义 如果您有日期
2011-12-01
(假设此处为yyyy-MM-dd
),并且您希望所有在这一天有时间戳的行,那么您将搜索时间戳为=2011-12-01
和<2011-12-02
的所有行
因此,在日期中添加1天(使用临时日历对象),并使用以下代码:
criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate));
criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay));
如果您正在寻找按日期范围过滤的通用方法(例如从今天到明天)。 我是这样用的: 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();
}
当然,每个代码中都有重构的空间。如果我将日期转换为字符串,那么它会显示2011-12-11 02:00:00',如果我减去或添加一天,那么我的查询将不会得到合理的结果。通过这种方式,我将获得由于时间原因而在指定日期之前存在的条目。使用适当的日期限制。将所有时间字段(小时、分钟、秒、毫秒)设置为0。这就是下限。加上一天。这就是上限。
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();
}