Upitajte entitete prema datumima i vremenima pomoću Spring Data JPA

1. Uvod

U ovom brzom vodiču vidjet ćemo kako upitivati ​​entitete prema datumima pomoću Spring Data JPA.

Prvo ćemo osvježiti svoje sjećanje o tome kako mapirati datume i vremena pomoću JPA.

Zatim ćemo stvoriti entitet s poljima datuma i vremena, kao i spremište proljetnih podataka koji će ih pitati.

2. Mapiranje datuma i vremena s JPA

Za početnike, razmotrit ćemo malo teorije o mapiranju datuma pomoću JPA. Ono što treba znati je da moramo odlučiti želimo li zastupati:

  • Samo spoj
  • Samo vrijeme
  • Ili oboje

Pored (neobavezno) @Stupac napomena, morat ćemo dodati @Temporal napomena da specificira što polje predstavlja.

Ova napomena uzima parametar koji je vrijednost Nabroj TemporalType:

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

Detaljan članak o mapiranju datuma i vremena pomoću JPA možete pronaći ovdje.

3. U praksi

U praksi, nakon što su naši entiteti ispravno postavljeni, nema puno posla za njihovo postavljanje pomoću Spring Data JPA. Jednostavno moramo koristiti metode upita, @Query bilješka.

Svaki JPA mehanizam Spring Data funkcionirat će sasvim u redu.

Pogledajmo nekoliko primjera entiteta upitanih prema datumima i vremenima pomoću Spring Data JPA.

3.1. Postavljanje entiteta

Za početak recimo da imamo Članak entitet, s datumom objavljivanja, vremenom objavljivanja i datumom i vremenom stvaranja:

@Entity javni razred Article {@Id @GeneratedValue Integer id; @Temporal (TemporalType.DATE) Datum objaveDatum; @Temporal (TemporalType.TIME) Datum objaveTime; @Temporal (TemporalType.TIMESTAMP) Datum kreiranjaDateTime; }

Datum i vrijeme objavljivanja podijelili smo u dva polja u svrhu demonstracije. Na taj su način predstavljene tri vremenske vrste.

3.2. Upitajte entitete

Sad kad je naš entitet već postavljen, stvorimo Spring Data spremište pitati te članke.

Stvorit ćemo tri metode, koristeći nekoliko značajki Spring Data JPA:

javno sučelje ArticleRepository proširuje JpaRepository {List findAllByPublicationDate (Datum objaveDate); Popis findAllByPublicationTimeBetween (Datum objaveTimeStart, Datum objaveTimeEnd); @Query ("odaberite a iz članka a gdje je a.creationDateTime <=: createDateTime") Popis findAllWithCreationDateTimeBefore (@Param ("creationDateTime") Datum stvaranjaDateTime); }

Tako smo definirali tri metode:

  • findAllByPublicationDate koja preuzima članke objavljene na određeni datum
  • findAllByPublicationTimeBetween koja pronalazi članke objavljene između dva zadana sata
  • i findAllWithCreationDateTimeBefore koji dohvaća članke stvorene prije određenog datuma i vremena

Dvije prve metode oslanjaju se na Spring Data metode upita mehanizam i zadnji na @Query bilješka.

Na kraju, to ne mijenja način na koji će se tretirati datumi. Prva metoda uzima u obzir samo datumski dio parametra.

Drugi će uzeti u obzir samo vrijeme parametara. A posljednji će koristiti i datum i vrijeme.

3.3. Testirajte upite

Posljednje što moramo učiniti je postaviti neke testove kako bismo provjerili rade li ovi upiti kako se očekivalo.

Prvo ćemo uvesti nekoliko podataka u našu bazu podataka, a zatim ćemo stvoriti test klasu koja će provjeravati svaku metodu spremišta:

@RunWith (SpringRunner.class) @DataJpaTest javna klasa ArticleRepositoryIntegrationTest {@Autowired privatno repozitorij ArticleRepository; @Test public void whenFindByPublicationDate_thenArticles1And2Returned () {Rezultat popisa = repozitorij.findAllByPublicationDate (novi SimpleDateFormat ("yyyy-MM-dd"). Parse ("01.01.2018.")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (1, 2) .contens (id))); } @Test public void whenFindByPublicationTimeBetween_thenArticles2And3Returned () {Rezultat popisa = repozitorij.findAllByPublicationTimeBetween (novi SimpleDateFormat ("HH: mm"). Parse ("15:15"), novi SimpleDateFormat ("HH: mm" 16. 30 ")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (2, 3) .contain (id))); } @Test public void givenArticlesWhenFindWithCreationDateThenArticles2And3Returned () {List result = repository.findAllWithCreationDateTimeBefore (new SimpleDateFormat ("yyyy-MM-dd HH: mm"). Parse ("2017-12-15 10:00"); parse ("2017-12-15 10:00"). assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (2, 3) .contens (id));}}

Svaki test provjerava jesu li dohvaćeni samo članci koji odgovaraju uvjetima.

4. Zaključak

U ovom kratkom članku vidjeli smo kako upiti entitete pomoću polja datuma i vremena pomoću Spring Data JPA.

Naučili smo malo teorije prije korištenja Spring Data mehanizama za ispitivanje entiteta. Vidjeli smo da ti mehanizmi rade na isti način s datumima i vremenima kao i s drugim vrstama podataka.

Izvorni kôd za ovaj članak dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found