Entitas Kueri menurut Tanggal dan Waktu dengan JPA Data Musim Semi

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat cara membuat kueri entitas berdasarkan tanggal dengan Spring Data JPA.

Pertama-tama kami akan menyegarkan ingatan kami tentang cara memetakan tanggal dan waktu dengan JPA.

Kemudian, kita akan membuat entitas dengan bidang tanggal dan waktu serta repositori Data Musim Semi untuk menanyakan entitas tersebut.

2. Memetakan Tanggal dan Waktu dengan JPA

Sebagai permulaan, kami akan mengulas sedikit teori tentang memetakan tanggal dengan JPA . Hal yang perlu diketahui adalah kita perlu memutuskan apakah kita ingin mewakili:

  • Kencan saja
  • Waktu saja
  • Atau keduanya

Selain anotasi @Column (opsional) , kita perlu menambahkan anotasi @Temporal untuk menentukan apa yang diwakili oleh bidang.

Anotasi ini mengambil parameter yang merupakan nilai dari TemporalType enum :

  • TemporalType.DATE
  • TemporalType.TIME
  • TemporalType.TIMESTAMP

Artikel mendetail tentang pemetaan tanggal dan waktu dengan JPA dapat ditemukan di sini.

3. Dalam Praktek

Dalam praktiknya, setelah entitas kami disiapkan dengan benar, tidak banyak pekerjaan yang harus dilakukan untuk meminta mereka menggunakan Spring Data JPA. Kami hanya perlu menggunakan metode kueri, anotasi @Query .

Setiap mekanisme JPA Spring Data akan bekerja dengan baik .

Mari kita lihat beberapa contoh entitas yang dikueri menurut tanggal dan waktu dengan Spring Data JPA.

3.1. Siapkan Entitas

Sebagai permulaan, katakanlah kita memiliki entitas Artikel , dengan tanggal publikasi, waktu publikasi, dan tanggal dan waktu 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 membagi tanggal dan waktu publikasi menjadi dua bidang untuk tujuan demonstrasi. Dengan cara itu ketiga tipe temporal direpresentasikan.

3.2. Buat Kueri Entitas

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

Kami akan membuat tiga metode, menggunakan beberapa fitur JPA Spring Data:

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

Jadi kami mendefinisikan tiga metode:

  • findAllByPublicationDate yang mengambil artikel yang diterbitkan pada tanggal tertentu
  • findAllByPublicationTimeBetween yang mengambil artikel yang diterbitkan antara dua jam tertentu
  • dan findAllWithCreationDateTimeBefore yang mengambil artikel yang dibuat sebelum tanggal dan waktu tertentu

Dua metode pertama mengandalkan mekanisme metode kueri Data Musim Semi dan yang terakhir pada anotasi @Query .

Pada akhirnya, itu tidak mengubah cara penanganan tanggal. Metode pertama hanya akan mempertimbangkan bagian tanggal dari parameter.

Yang kedua hanya akan mempertimbangkan waktu parameter. Dan yang terakhir akan menggunakan tanggal dan waktu.

3.3. Uji Kueri

Hal terakhir yang harus kami lakukan adalah menyiapkan beberapa pengujian untuk memeriksa apakah kueri ini berfungsi seperti yang diharapkan.

Pertama-tama kita akan mengimpor beberapa data ke dalam database kita dan kemudian kita akan membuat kelas percobaan yang akan memeriksa setiap metode 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 pengujian memverifikasi bahwa hanya artikel yang cocok dengan kondisi yang diambil.

4. Kesimpulan

Dalam artikel singkat ini, kami telah melihat cara membuat kueri entitas menggunakan bidang tanggal dan waktunya dengan JPA Data Musim Semi.

Kami mempelajari sedikit teori sebelum menggunakan mekanisme Spring Data untuk menanyakan entitas. Kami melihat mekanisme tersebut bekerja dengan cara yang sama dengan tanggal dan waktu seperti halnya dengan jenis data lainnya.

Kode sumber untuk artikel ini tersedia di GitHub.