JPA-запрос на день без учета времени - PullRequest
10 голосов
/ 27 августа 2011

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

@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.

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

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

Ответы [ 2 ]

10 голосов
/ 22 ноября 2012

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

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

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

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

Я нашел способ сделать это с помощью Criteria Query:

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

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

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

6 голосов
/ 27 августа 2011
select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay

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

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

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