Критерии гибернации для дат - PullRequest
23 голосов
/ 26 апреля 2011

В оракуле у меня есть даты в формате

17 апреля 2011 г. 19: 20: 23,707000000

Я бы хотел получить все заказы за 17-04-2011.

 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
    Criteria criteria = 
                session.createCriteria(Order.class);
Criterion restrictDate = Restrictions.like("orderDate",date); 

но это приносит мне пустой результат:

Ответы [ 3 ]

46 голосов
/ 26 апреля 2011

Почему вы используете Restrictions.like(...)?

Вы должны использовать Restrictions.eq(...).

Обратите внимание, что вы также можете использовать .le, .lt, .ge, .gt для объектов даты в качестве операторов сравнения. Оператор LIKE не подходит для этого случая, поскольку LIKE полезен, когда вы хотите сопоставить результаты в соответствии с частичным содержимым столбца. Пожалуйста, см. http://www.sql -tutorial.net / SQL-LIKE.asp для справки.

Например, если у вас есть столбец имени с полным именем некоторых людей, вы можете сделать where name like 'robert %', чтобы вы возвращали все записи с именем, начинающимся с 'robert ' (% может заменить любой символ).

В вашем случае вы знаете полное содержание даты, которую вы пытаетесь сопоставить, поэтому вам не следует использовать LIKE, но равенство. Я думаю, что Hibernate не дает вам никаких исключений в этом случае, но в любом случае у вас, вероятно, будет та же проблема с Restrictions.eq(...).

Ваш объект даты, который вы получили с кодом:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);

Этот объект даты равен 17-04-2011 в 0 часов, 0 минут, 0 секунд и 0 наносекунд.

Это означает, что ваши записи в базе данных должны иметь точно этой даты. Я имею в виду, что если в вашей записи базы данных есть дата «17-April-2011 19: 20: 23.707000000», то она не будет получена, потому что вы просто запрашиваете эту дату: «17-April-2011 00:00: +00,0000000000" .

Если вы хотите получить все записи вашей базы данных за определенный день, вам нужно будет использовать следующий код:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
    String myDate = "17-04-2011";
    // Create date 17-04-2011 - 00h00
    Date minDate = formatter.parse(myDate);
    // Create date 18-04-2011 - 00h00 
    // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
    Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
    Conjunction and = Restrictions.conjunction();
    // The order date must be >= 17-04-2011 - 00h00
    and.add( Restrictions.ge("orderDate", minDate) );
    // And the order date must be < 18-04-2011 - 00h00
    and.add( Restrictions.lt("orderDate", maxDate) ); 
5 голосов
/ 12 декабря 2012

Используя этот способ, вы можете получить список выбранных записей.

GregorianCalendar gregorianCalendar = new GregorianCalendar();
Criteria cri = session.createCriteria(ProjectActivities.class);
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
List list = cri.list();

Все записи будут сгенерированы в список, который больше или равен '08 -Oct-2012 'или же пройдет дату принятия пользователя в 2-м параметре Ограничения (gregorianCalendar.getTime()) критериев для получения записей .

2 голосов
/ 06 марта 2015

Если столбец является отметкой времени, вы можете сделать следующее:

        if(fromDate!=null){
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')"));
        }
        if(toDate!=null){               
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')"));
        }

        resultDB = criteria.list();
...