Ответ 1
q.setParameter("calendar", c, TemporalType.DATE)
Вы можете передать метод TemporalType.DATE методу setParameter для усечения даты + времени.
Я пытаюсь сравнить Calendar
с JPA2. Запрос выглядит примерно так:
TypedQuery<X> q = em.createQuery("select r from Record r where r.calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c);
Это, однако, сравнивает дату + время. Я хочу знать, является ли MM: DD: YYYY равным и не заботятся о времени. Есть ли хороший способ сделать это в JPA2 или мне нужно создать собственный запрос?
Я попытался установить HH: MM: SS:... на ноль, прежде чем сохранять его в db, но я не знаю, очень ли это разумно, в отношении часовых поясов и летнего времени и т.д.
q.setParameter("calendar", c, TemporalType.DATE)
Вы можете передать метод TemporalType.DATE методу setParameter для усечения даты + времени.
Нет никаких упоминаний о функциях DateTime, позволяющих делать это в спецификации JPQL, но вы всегда можете обманывать и делать
select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
При использовании базы данных Oracle вы можете использовать функцию trunc
в вашем запросе JPQL, например:
TypedQuery<X> q = em.createQuery("select r from Record r where trunc(r.calendar) = trunc(:calendar)", X.class);
Смотрите также https://cirovladimir.wordpress.com/2015/05/18/jpa-trunc-date-in-jpql-query-oracle/
Мне пришлось использовать date_trunc в предложении where:
TypedQuery<X> q = em.createQuery("select r from Record r where date_trunc('day',r).calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c, TemporalType.DATE);
Мое решение работало с данными spring jpa @query:
select * from table_name where substring(something.date, 1,10) = substring(date_from_param, 1,10)
Он отлично работает, но вы должны быть уверены, что дата всегда в правильном формате.
Совместимое с Mysql и H2 сравнение дат без учета временной части:
'@Query("SELECT DISTINCT s " +
"FROM Session s " +
"JOIN s.movie m " +
"WHERE m.id = :movie AND CAST(s.time AS date) = CAST(:date AS date) " +
"ORDER BY s.time")
List<Session> getByMovieAndDate(@Param("movie") Long movie, @Param("date") LocalDateTime date);'