Mysqlで動作する単純なSpring Data JPAプロジェクトがあり、日と月に一致するすべてのレジスタをフェッチする必要があります。フィルタリングする必要がある列は、Datetimeタイプです。
1935-12-08 00:00:00
これをデータベースレベルで実行する場合は、正常に機能します。
SELECT * FROM my_database.event where event_date LIKE '%-12-08%';
日付を文字列として扱います。リポジトリでこれを行う必要がありますが、何も動作しないようです。私は基本的なものを試しました:
List<Event> findByEventDateLike(
@Param("eventDate") Date eventDate);
ただし、Dateオブジェクトであるため、不正な引数の例外が返されます。私は他の組み合わせを試しましたが、どうやら春のデータJPAは日付を部分的な情報と比較することができません。
注:わかりやすくするために、@ Queryの文を避けようとしていますが、それが唯一の方法である場合は、有効な答えです。
どうすればできますか?
データベースでクエリをエミュレートするには、nativeQueryを使用します。
@Query(value = "SELECT * FROM events WHERE event_date Like %?1%", nativeQuery = true)
List<Match> findByMatchMonthAndMatchDay(@Param ("eventDate") String eventDate);
DBは、LIKE句の日付/文字列間の変換を処理します。
パラメータを「-month-day」(例:-12-08)として渡すと、日付フィールドにその文字列を含むイベントのコレクションが返されます。
JPAプロバイダーがHibernateの場合、JPQL(HQL)クエリでyear
およびmonth
(および other funcs )を使用できます。たとえば、次のようになります。
@Query("select e from Event e where year(e.eventDate) = ?1 and month(e.eventDate) = ?2")
List<Entity> getByYearAndMonth(int year, int month);
以下のコードはZonedDateTime(startDate)で機能します。現在、DateTimeをテストする機会はありません。
@Query("SELECT b FROM Box b " +
"WHERE EXTRACT (day FROM b.startDate) = :dayOfMonth AND EXTRACT (month FROM b.startDate) = :month")
List<Box> findBoxWithParticularDayAndMonth(@Param("dayOfMonth") Integer dayOfMonth, @Param("month") Integer month);
使用法:
List<Box> boxes = boxRepo.findBoxWithParticularDayAndMonth(22, 5);
Java:Date to String Convert Java.util.Date to String
@Query("select e from Event e where e.eventDate like %:eventDate%")
List<Entity> findByEventDateLike(@Param("eventDate")String eventDate);
私にとっては簡単な方法は日付を文字列に解析することですが、あなたが試すことができる別の解決策を見つけました
春のJpaRepositoryでの%Like%クエリhttps://docs.spring.io/spring-data/jpa/docs/current/reference/html/
含む
findByFirstnameContaining
…?1のようなx.firstname(%でラップされたパラメータバインド)