Сравнить только дату (без времени) в JPA2 (JPQL) - PullRequest
14 голосов
/ 04 мая 2011

Я пытаюсь сравнить Calendar s с 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);

Это, однако, сравнивает дату + время.Я хочу знать, равны ли ММ: ДД: ГГГГ и не заботятся о времени.Есть ли хороший способ сделать это в JPA2 или мне нужно создать собственный запрос?

Я пытался установить значение ЧЧ: ММ: СС: ... до нуля, прежде чем сохранить его в БД, но я не знаю, насколько это разумно, в отношении часовых поясов, летнего времени и прочего.

Ответы [ 6 ]

26 голосов
/ 08 мая 2011
q.setParameter("calendar", c, TemporalType.DATE)

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

8 голосов
/ 04 мая 2011

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

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
1 голос
/ 07 мая 2019

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

1 голос
/ 09 января 2019

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);`
0 голосов
/ 07 ноября 2016

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

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

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

0 голосов
/ 19 февраля 2014

Мне пришлось использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...