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);
ただし、これは日付と時刻を比較します。 MM:DD:YYYYが等しいかどうかを知り、時間を気にしません。 JPA2でそれを行うには良い方法はありますか、それともネイティブクエリを作成する必要がありますか?
HH:MM:SS:...をゼロに設定してからdbに保存しようとしましたが、タイムゾーンや夏時間などに関して、これが非常に賢明かどうかわかりません。
q.setParameter("calendar", c, TemporalType.DATE)
TemporalType.DATEをsetParameterメソッドに渡して、日付と時刻を切り捨てることができます。
JPQLの仕様ではそれを可能にするDateTime関数についての言及はありませんが、いつでもカンニングして実行することができます
select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
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/
時間の部分を無視した日付の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);`
私のソリューションは春のデータJPA @クエリで動作しました:
select * from table_name where substring(something.date, 1,10) = substring(date_from_param, 1,10)
正常に機能しますが、日付が常に適切な形式であることを確認する必要があります。
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);