Запрос 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.