Как лучше работать со временем, используя Hibernate Criteria и Oracle? - PullRequest
3 голосов
/ 16 января 2012

Я хочу выбрать сущность по времени.У меня есть СУБД Oracle с типом поля DATE, которые содержат дату и время.Это мой кодКак выбрать данные по временным критериям?

Calendar timeCal = new GregorianCalendar(0,0,0,0,0,0);
Date     timeMin = timeCal.getTime();

timeCal.add(Calendar.HOUR_OF_DAY, 1);
Date     timeMax = timeCal.getTime();

if (minDate != null && maxDate != null)
    criteria.add(Restrictions.between("eventDate", minDate, maxDate));

if (onDate != null) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(onDate);
    calendar.add(Calendar.DAY_OF_MONTH, 1);
    criteria.add(Restrictions.between("eventDate", onDate, calendar.getTime()));
}

if(minTime!=null&&maxTime!=null){
    /*
      How to add Restriction on eventDate field, for time only?
      if minTime is 3:00 and maxTime is 16:00, must to return
      all rows having the time part of their eventDate between 
      3:00 and 16:00, regardless of the date part
    */
}

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Я нахожу ответ.Просто нужно использовать sqlRestriction.

criteria.add(
    Restrictions.sqlRestriction(
        " NUMTODSINTERVAL(EVENT_DATE - TRUNC(EVENT_DATE), 'DAY') BETWEEN  NUMTODSINTERVAL (?,'SECOND') AND NUMTODSINTERVAL (?,'SECOND')",
        new Object[] { secondsForBegin, secondsForEnd },
        new Type[]   { StandardBasicTypes.INTEGER, StandardBasicTypes.INTEGER }));
1 голос
/ 16 января 2012

Hibernate HQL имеет функции hour, minute и second, которые вы можете использовать в данном конкретном случае, так что вы можете сделать это на HQL, а не на SQL. Таким образом, вам понадобится HQL-запрос вместо объекта Criteria. HQL будет выглядеть примерно так:

from  tableName
where eventDate between :minDate and :maxDate
  and 3600 * hour( eventDate ) + 60 * minute( eventDate ) + second( eventDate )
      between :minSeconds and :maxSeconds

, где вы соответственно установите параметры :minSeconds и :maxSeconds. Следите за ошибками с одним :maxDate.

Более подробную информацию о HQL можно найти по адресу http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

0 голосов
/ 16 января 2012

Для этого вам нужно будет использовать ограничение SQL или, что предпочтительнее, создать собственную реализацию Criterion, которая выдаст соответствующее ограничение SQL.

Используйте класс org.hibernate.criterion.IlikeExpression в качестве примера: когда он не использует диалект PostgreSQL, он генерирует выражение SQL lower(columnName) like ?, где аргументом выражения является value.toString().toLowerCase().

Ваш критерий должен генерировать что-то вроде to_date(to_char(columnName, 'HH24:MI:SS'), 'HH24:MI:SS') < ?), где аргументом вашего выражения является ваше максимальное время.(И, конечно, выполните аналогичный критерий для минимального времени)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...