Spring Data JPAを使用した日時によるエンティティのクエリ
1. 前書き
このクイックチュートリアルでは、Spring DataJPAを使用して日付でエンティティをクエリする方法を説明します。
まず、JPAを使用して日付と時刻をマッピングする方法についての記憶を更新します。
次に、日付と時刻のフィールドを持つエンティティと、それらのエンティティをクエリするためのSpringDataリポジトリを作成します。
2. JPAを使用した日付と時刻のマッピング
手始めに、we’ll review a bit of theory about mapping dates with JPA。 知っておくべきことは、表現するかどうかを決定する必要があるということです。
-
日付のみ
-
時間だけ
-
または両方
(オプションの)@Columnアノテーションに加えて、フィールドが何を表すかを指定するために@Temporalアノテーションを追加する必要があります。
この注釈は、TemporalType enumの値であるパラメーターを取ります。
-
TemporalType.DATE
-
TemporalType.TIME
-
TemporalType.TIMESTAMP
JPAを使用した日時のマッピングに関する詳細な記事は、hereにあります。
3. 実際には
実際には、エンティティが正しく設定されたら、Spring Data JPAを使用してエンティティをクエリするために行う作業はあまりありません。 query methods, @Query annotationを使用する必要があります。
Every Spring Data JPA mechanism will work just fine。
Spring DataJPAを使用して日時でクエリされたエンティティの例をいくつか見てみましょう。
3.1. エンティティを設定する
手始めに、Articleエンティティがあり、公開日、公開時刻、作成日時が含まれているとします。
@Entity
public class Article {
@Id
@GeneratedValue
Integer id;
@Temporal(TemporalType.DATE)
Date publicationDate;
@Temporal(TemporalType.TIME)
Date publicationTime;
@Temporal(TemporalType.TIMESTAMP)
Date creationDateTime;
}
デモンストレーションの目的で、公開日時を2つのフィールドに分割します。 そのようにして、3つの時間タイプが表されます。
3.2. エンティティのクエリ
エンティティがすべて設定されたので、これらの記事をクエリするためのSpring Datarepositoryを作成しましょう。
いくつかのSpringData JPA機能を使用して、次の3つのメソッドを作成します。
public interface ArticleRepository
extends JpaRepository {
List findAllByPublicationDate(Date publicationDate);
List findAllByPublicationTimeBetween(
Date publicationTimeStart,
Date publicationTimeEnd);
@Query("select a from Article a where a.creationDateTime <= :creationDateTime")
List findAllWithCreationDateTimeBefore(
@Param("creationDateTime") Date creationDateTime);
}
そこで、3つのメソッドを定義しました。
-
特定の日に公開された記事を取得するfindAllByPublicationDate
-
findAllByPublicationTimeBetweenは、指定された2時間の間に公開された記事を取得します
-
およびfindAllWithCreationDateTimeBeforeは、指定された日時より前に作成された記事を取得します
最初の2つの方法は、Spring Dataquery methodsメカニズムに依存し、最後の方法は@Queryアノテーションに依存しています。
結局、それは日付の扱い方を変えるものではありません。 The first method will only consider the date part of the parameter.
2番目は、パラメーターの時間のみを考慮します。 そして最後は日付と時刻の両方を使用します。
3.3. クエリをテストする
最後に、これらのクエリが期待どおりに機能することを確認するためのテストを設定する必要があります。
最初にいくつかのデータをデータベースにインポートしてから、リポジトリの各メソッドをチェックするテストクラスを作成します。
@RunWith(SpringRunner.class)
@DataJpaTest
public class ArticleRepositoryIntegrationTest {
@Autowired
private ArticleRepository repository;
@Test
public void whenFindByPublicationDate_thenArticles1And2Returned() {
List result = repository.findAllByPublicationDate(
new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(1, 2).contains(id)));
}
@Test
public void whenFindByPublicationTimeBetween_thenArticles2And3Returned() {
List result = repository.findAllByPublicationTimeBetween(
new SimpleDateFormat("HH:mm").parse("15:15"),
new SimpleDateFormat("HH:mm").parse("16:30"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(2, 3).contains(id)));
}
@Test
public void givenArticlesWhenFindWithCreationDateThenArticles2And3Returned() {
List result = repository.findAllWithCreationDateTimeBefore(
new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(2, 3).contains(id));
}
}
各テストでは、条件に一致する記事のみが取得されることを確認します。
4. 結論
この短い記事では、Spring DataJPAで日付と時刻のフィールドを使用してエンティティにクエリを実行する方法を説明しました。
「Spring Dataメカニズム」を使用してエンティティを照会する前に、少し理論を学びました。 これらのメカニズムは、他のタイプのデータと同じように、日付と時刻でも同じように機能することがわかりました。
この記事のソースコードはover on GitHubで入手できます。