web-dev-qa-db-ja.com

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:...をゼロに設定してからdbに保存しようとしましたが、タイムゾーンや夏時間などに関して、これが非常に賢明かどうかわかりません。

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

TemporalType.DATEをsetParameterメソッドに渡して、日付と時刻を切り捨てることができます。

27
Otávio Garcia

JPQLの仕様ではそれを可能にするDateTime関数についての言及はありませんが、いつでもカンニングして実行することができます

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

Oracleデータベースを使用する場合は、JPQLクエリでtrunc関数を使用できます。例:

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
Pierre

時間の部分を無視した日付の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);`
3
pshvetso

私のソリューションは春のデータJPA @クエリで動作しました:

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

正常に機能しますが、日付が常に適切な形式であることを確認する必要があります。

0
RichardK

Where句でdate_truncを使用する必要がありました。

    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);
0
Roger