Forespørgselsenheder efter datoer og tider med Spring Data JPA

1. Introduktion

I denne hurtige vejledning ser vi, hvordan man forespørger på enheder efter datoer med Spring Data JPA.

Vi opdaterer først vores hukommelse om, hvordan vi kortlægger datoer og tidspunkter med JPA.

Derefter opretter vi en enhed med dato- og tidsfelter samt et Spring Data-arkiv til forespørgsel på disse enheder.

2. Kortlægning af datoer og tider med JPA

Til at begynde med, vi gennemgår en smule teori om kortlægningsdatoer med JPA. Ting at vide er, at vi skal beslutte, om vi vil repræsentere:

  • Kun en dato
  • Kun en tid
  • Eller begge

Ud over (valgfrit) @Kolonne kommentar, skal vi tilføje @Temporal kommentar for at specificere, hvad feltet repræsenterer.

Denne kommentar tager en parameter, der er en værdi af TemporalType enum:

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

En detaljeret artikel om kortlægning af datoer og tidspunkter med JPA kan findes her.

3. I praksis

Når vores enheder er konfigureret korrekt, er der i praksis ikke meget arbejde at gøre for at spørge dem ved hjælp af Spring Data JPA. Vi skal bare bruge forespørgselsmetoder, @Query kommentar.

Hver forårsdata JPA-mekanisme fungerer fint.

Lad os se et par eksempler på enheder spurgt efter datoer og tidspunkter med Spring Data JPA.

3.1. Opret en enhed

Lad os begynde med at sige, at vi har en Artikel enhed med en offentliggørelsesdato, en offentliggørelsestid og en oprettelsesdato og -tid:

@Entity public class Article {@Id @GeneratedValue Integer id; @Temporal (TemporalType.DATE) Dato offentliggørelsesdato; @Temporal (TemporalType.TIME) Dato offentliggørelseTid; @Temporal (TemporalType.TIMESTAMP) Date creationDateTime; }

Vi deler publikationsdato og -tid i to felter til demonstrationsformål. På den måde er de tre tidsmæssige typer repræsenteret.

3.2. Spørg enhederne

Nu hvor vores enhed er klar, lad os oprette en Spring Data lager at spørge disse artikler.

Vi opretter tre metoder ved hjælp af flere Spring Data JPA-funktioner:

offentlig grænseflade ArticleRepository udvider JpaRepository {Liste findAllByPublicationDate (dato for offentliggørelsesdato); Liste findAllByPublicationTimeBetween (Dato publikationTimeStart, Dato offentliggørelseTimeEnd); @Query ("vælg en fra artikel a hvor a.creationDateTime <=: creationDateTime") Liste findAllWithCreationDateTimeBefore (@Param ("creationDateTime") Date creationDateTime); }

Så vi definerede tre metoder:

  • findAllByPublicationDate der henter artikler offentliggjort på en given dato
  • findAllByPublicationTimeBetween som henter artikler offentliggjort mellem to givne timer
  • og findAllWithCreationDateTimeBefore som henter artikler oprettet før en given dato og et klokkeslæt

De to første metoder er afhængige af Spring Data forespørgselsmetoder mekanisme og den sidste på @Forespørgsel kommentar.

I sidste ende ændrer det ikke den måde, hvorpå datoer behandles. Den første metode tager kun hensyn til datodelen af ​​parameteren.

Den anden vil kun overveje tidspunktet for parametrene. Og den sidste bruger både dato og klokkeslæt.

3.3. Test forespørgslerne

Den sidste ting, vi skal gøre, er at oprette nogle tests for at kontrollere, at disse forespørgsler fungerer som forventet.

Vi importerer først et par data i vores database, og derefter opretter vi testklassen, som kontrollerer hver metode i arkivet:

@RunWith (SpringRunner.class) @DataJpaTest offentlig klasse ArticleRepositoryIntegrationTest {@Autowired privat ArticleRepository repository; @Test offentlig ugyldig nårFindByPublicationDate_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 offentlig ugyldig nårFindByPublicationTimeBetween_thenArticles2And3Returned () {List result = repository.findAllByPublicationTimeBetween (new SimpleDateFormat ("HH: mm"). Parse ("15:15"), ny SimpleDateFormat ("HH: mm)" 30 ")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (2, 3) .contains (id))); } @Test offentligt ugyldigt givetArticlesWhenFindWithCreationDateThenArticles2And3Returned () {List result = repository.findAllWithCreationDateTimeBefore (new SimpleDateFormat ("åååå-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));}}

Hver test bekræfter, at kun de artikler, der matcher betingelserne, hentes.

4. Konklusion

I denne korte artikel har vi set, hvordan man forespørger enheder ved hjælp af deres datoer og tider felter med Spring Data JPA.

Vi lærte lidt teori, inden vi brugte Spring Data-mekanismer til at forespørge enhederne. Vi så, at disse mekanismer fungerer på samme måde med datoer og tidspunkter, som de gør med andre typer data.

Kildekoden til denne artikel er tilgængelig på GitHub.


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