Pertanyaan Entiti mengikut Tarikh dan Masa dengan JPA Spring Data

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat cara membuat pertanyaan entiti mengikut tarikh dengan Spring Data JPA.

Kami akan menyegarkan semula ingatan kami mengenai cara memetakan tarikh dan masa dengan JPA.

Kemudian, kami akan membuat entiti dengan medan tarikh dan masa serta repositori Spring Data untuk menanyakan entiti tersebut.

2. Memetakan Tarikh dan Masa dengan JPA

Sebagai permulaan, kami akan mengkaji sedikit teori mengenai pemetaan tarikh dengan JPA . Yang perlu diketahui ialah kita perlu memutuskan sama ada kita mahu mewakili:

  • Sebiji tarikh sahaja
  • Satu masa sahaja
  • Atau kedua-duanya

Sebagai tambahan kepada (pilihan) anotasi @Column , kami perlu menambahkan anotasi @Temporal untuk menentukan apa yang diwakili oleh medan.

Anotasi ini mengambil parameter yang merupakan nilai TemporalType enum :

  • TemporalType.DATE
  • Jenis Temporal.TIME
  • TemporalType.TIMESTAMP

Artikel terperinci mengenai pemetaan tarikh dan masa dengan JPA boleh didapati di sini.

3. Dalam Amalan

Dalam praktiknya, setelah entiti kami ditubuhkan dengan betul, tidak banyak kerja yang perlu dilakukan untuk membuat pertanyaan dengan menggunakan Spring Data JPA. Kita hanya perlu menggunakan kaedah pertanyaan, penjelasan @Query .

Setiap mekanisme Spring Data JPA akan berfungsi dengan baik .

Mari kita lihat beberapa contoh entiti yang ditanyakan mengikut tarikh dan masa dengan Spring Data JPA.

3.1. Sediakan Entiti

Sebagai permulaan, katakanlah kita mempunyai entiti Artikel , dengan tarikh penerbitan, masa penerbitan dan tarikh dan masa pembuatan:

@Entity public class Article { @Id @GeneratedValue Integer id; @Temporal(TemporalType.DATE) Date publicationDate; @Temporal(TemporalType.TIME) Date publicationTime; @Temporal(TemporalType.TIMESTAMP) Date creationDateTime; }

Kami membahagikan tarikh dan masa penerbitan menjadi dua bidang untuk tujuan demonstrasi. Dengan cara itu tiga jenis temporal diwakili.

3.2. Pertanyaan Entiti

Sekarang entiti kita sudah siap, mari buat repositori Spring Data untuk menanyakan artikel tersebut.

Kami akan membuat tiga kaedah, menggunakan beberapa ciri Spring Data JPA:

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); }

Oleh itu, kami menentukan tiga kaedah:

  • findAllByPublicationDate yang mengambil artikel yang diterbitkan pada tarikh tertentu
  • findAllByPublicationTimeBetween yang mengambil artikel yang diterbitkan antara dua jam tertentu
  • dan cariAllWithCreationDateTimeBeberapa yang mengambil artikel yang dibuat sebelum tarikh dan masa tertentu

Dua kaedah pertama bergantung pada mekanisme kaedah pertanyaan Data Spring dan yang terakhir pada anotasi @Query .

Pada akhirnya, itu tidak mengubah cara kurma diperlakukan. Kaedah pertama hanya akan mempertimbangkan bahagian tarikh parameter.

Yang kedua hanya akan mempertimbangkan masa parameter. Dan yang terakhir akan menggunakan tarikh dan masa.

3.3. Uji Pertanyaan

Perkara terakhir yang harus kita lakukan adalah menyediakan beberapa ujian untuk memastikan bahawa pertanyaan ini berfungsi seperti yang diharapkan.

Kami mula-mula mengimport beberapa data ke dalam pangkalan data kami dan kemudian kami akan membuat kelas ujian yang akan memeriksa setiap kaedah repositori:

@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)); } }

Setiap ujian mengesahkan bahawa hanya artikel yang sesuai dengan syarat yang diambil.

4. Kesimpulan

Dalam artikel pendek ini, kami telah melihat cara membuat pertanyaan entiti menggunakan bidang tarikh dan waktu mereka dengan Spring Data JPA.

Kami mempelajari sedikit teori sebelum menggunakan mekanisme Spring Data untuk menyoal entiti. Kami melihat mekanisme tersebut berfungsi sama dengan tarikh dan masa seperti yang berlaku dengan jenis data lain.

Kod sumber untuk artikel ini terdapat di GitHub.