Запрос JPA для дня, игнорирующего время

Скажем, у вас есть класс с полем java.util.Date. Может быть, класс класса "Кому" или "Планировщик событий".

@Temporal(TemporalType.TIMESTAMP)
private Date startTime;

Это будет отображаться в столбце datetime в MySQL.

Существуют случаи, когда вы хотите точно знать, когда происходит это событие. "Что запланировано на 11 августа 2011 года в 8 часов вечера?"

Иногда вам просто нужно знать, какие события запланированы на определенную дату. "Что запланировано на 11 августа 2011 года?"

Если ваш JPAQL:

SELECT blah blah etc. WHERE ti.startTime = :d1

а параметр - экземпляр java.util.Date:

query.setParameter("d1", date, TemporalType.DATE);

ваши результаты будут ограничены датой, но также время.

Это такой распространенный случай использования, что я удивлен, что нет простого способа сделать это даже в JPA 2.0.

Я бы предпочел не использовать конкретный хакер или не играть со строками/подстроками.

Как вы решили эту проблему?

Ответ 1

Я знаю, что немного опоздал, но я нашел способ сделать это. Я использовал jpql следующим образом:

select s from S s where date(s.someDate) = :param

И я установил параметр с помощью:

query.setParameter("param", param, TemporalType.DATE);

То, как я нашел это с помощью Query Query, было:

builder.equal(
 builder.function("date", Date.class, root.get(S_.someDate)), 
 param
);

По крайней мере, с MySql он работает.

Надеюсь, это поможет.

Ответ 2

select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay

- относительно простое решение для реализации и работает над любой реализацией JPA.

Hibernate также позволяет добавлять функции на диалект, чтобы генерировать пользовательский SQL.