Сравните только часть даты даты с меткой времени в Hibernate - PullRequest
8 голосов
/ 23 января 2012

У меня есть метка времени в базе данных и в приложении у меня есть дата.Мне нравится писать критерии гибернации таким образом, чтобы hibernate мог получать все записи, совпадающие с датой, а не с временной частью.например,

в метке времени БД

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 ]

13 голосов
/ 23 января 2012

Если вы ищете общее использование фильтрации по диапазону дат (например, с сегодняшнего дня до завтра). Я использую это так:

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

И, конечно же, в каждом коде всегда есть место для рефакторинга.

4 голосов
/ 23 января 2012

Оператор like может использоваться только для строковых значений. Это не имеет смысла на свидании.

Если у вас есть дата 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));
1 голос
/ 07 октября 2014
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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...