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

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


person atamanroman    schedule 04.05.2011    source источник


Ответы (6)


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

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

person Otávio Garcia    schedule 08.05.2011
comment
Я думаю, что он не работает, когда у вас есть аннотация @Temporal (TemporalType.TIMESTAMP) в определении столбца в объекте. Вы знаете, как исправить этот случай? - person Zavael; 19.10.2015
comment
Это НЕ работает, когда у нас есть аннотация @Temporal (TemporalType.TIMESTAMP) в определении столбца в сущности. - person Buddhika Ariyaratne; 26.06.2021

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

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
person JB Nizet    schedule 04.05.2011

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

person Pierre    schedule 07.05.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);`
person pshvetso    schedule 09.01.2019

Мне пришлось использовать 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);
person Roger    schedule 19.02.2014
comment
Какого провайдера вы используете? - person Jaumzera; 03.05.2016
comment
я использую спящий режим - person Roger; 25.08.2016

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

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

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

person RichardK    schedule 07.11.2016