Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较日期';在Hibernate中,s日期部分仅带有时间戳_Java_Hibernate - Fatal编程技术网

Java 比较日期';在Hibernate中,s日期部分仅带有时间戳

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);

我在数据库中有时间戳,在应用程序中有日期。我喜欢编写hibernate标准,这样hibernate可以提取所有与日期匹配的条目,而不是时间部分。 e、 g

以DB为单位的时间戳

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);

提前感谢

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();
}