Только сравнение даты (без времени) в JPA2 (JPQL)

Я пытаюсь сравнить 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, но я не знаю, очень ли это разумно, в отношении часовых поясов и летнего времени и т.д.

Ответы

Ответ 1

q.setParameter("calendar", c, TemporalType.DATE)

Вы можете передать метод TemporalType.DATE методу setParameter для усечения даты + времени.

Ответ 2

Нет никаких упоминаний о функциях DateTime, позволяющих делать это в спецификации JPQL, но вы всегда можете обманывать и делать

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock

Ответ 3

При использовании базы данных 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/

Ответ 4

Мне пришлось использовать 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);

Ответ 5

Мое решение работало с данными spring jpa @query:

select * from table_name where substring(something.date, 1,10) = substring(date_from_param, 1,10)

Он отлично работает, но вы должны быть уверены, что дата всегда в правильном формате.

Ответ 6

Совместимое с 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);'