Spørringsenheter etter datoer og tider med Spring Data JPA

1. Introduksjon

I denne raske opplæringen vil vi se hvordan du spør etter enheter etter datoer med Spring Data JPA.

Vi oppdaterer først minnet vårt om hvordan vi kartlegger datoer og klokkeslett med JPA.

Deretter oppretter vi en enhet med dato- og tidsfelt, samt et Spring Data-arkiv for å spørre om disse enhetene.

2. Kartlegge datoer og tider med JPA

For nybegynnere, Vi gjennomgår litt teori om kartleggingsdatoer med JPA. Tingen å vite er at vi må bestemme om vi vil representere:

  • Bare en dato
  • Bare en tid
  • Eller begge

I tillegg til (valgfritt) @Kolonne merknad, må vi legge til @Temporal kommentar for å spesifisere hva feltet representerer.

Denne merknaden tar en parameter som er verdien av TemporalType enum:

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

En detaljert artikkel om datoer og tidskartlegging med JPA finner du her.

3. I praksis

Når enhetene våre er riktig konfigurert, er det i praksis ikke mye arbeid å gjøre for å spørre dem ved hjelp av Spring Data JPA. Vi må bare bruke spørringsmetoder, @Query kommentar.

Hver JPA-mekanisme for vårdata vil fungere bra.

La oss se et par eksempler på enheter spurt etter datoer og tider med Spring Data JPA.

3.1. Sett opp en enhet

For det første, la oss si at vi har en Artikkel enhet, med en publiseringsdato, en publikasjonstid og en opprettelsesdato og -tid:

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

Vi deler publiseringsdato og -tid i to felt for demonstrasjonsformålet. På den måten er de tre timelige typene representert.

3.2. Spør enhetene

Nå som enheten vår er klar, la oss lage vårdata oppbevaringssted for å spørre om artiklene.

Vi oppretter tre metoder ved hjelp av flere Spring Data JPA-funksjoner:

offentlig grensesnitt ArticleRepository utvider JpaRepository {List findAllByPublicationDate (Date publicationDate); List findAllByPublicationTimeBetween (Dato publiseringTimeStart, Dato publiseringTimeEnd); @Query ("velg en fra artikkel a der a.creationDateTime <=: creationDateTime") Liste findAllWithCreationDateTimeBefore (@Param ("creationDateTime") Date creationDateTime); }

Så vi definerte tre metoder:

  • findAllByPublicationDate som henter ut artikler publisert på en gitt dato
  • findAllByPublicationTimeBetween som henter ut artikler publisert mellom to gitte timer
  • og findAllWithCreationDateTimeBefore som henter artikler opprettet før en gitt dato og tid

De to første metodene er avhengige av vårdata spørringsmetoder mekanisme og den siste på @Spørsmål kommentar.

Til slutt endrer det ikke måten datoene blir behandlet på. Den første metoden tar bare hensyn til datodelen av parameteren.

Den andre vil bare vurdere tidspunktet for parameterne. Og den siste vil bruke både dato og klokkeslett.

3.3. Test spørsmålene

Det siste vi må gjøre er å sette opp noen tester for å kontrollere at disse spørsmålene fungerer som forventet.

Vi importerer først noen få data til databasen vår, og deretter lager vi testklassen som vil sjekke hver metode i depotet:

@RunWith (SpringRunner.class) @DataJpaTest offentlig klasse ArticleRepositoryIntegrationTest {@Autowired private ArticleRepository repository; @Test offentlig ugyldig nårFindByPublicationDate_thenArticles1And2Returned () {List result = repository.findAllByPublicationDate (new SimpleDateFormat ("åååå-MM-dd"). Parsing ("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 offentlig ugyldig gittArticlesWhenFindWithCreationDateThenArticles2And3Returned () {Listresultat = repository.findAllWithCreationDateTimeBefore (ny 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 bekrefter at bare artiklene som samsvarer med vilkårene blir hentet.

4. Konklusjon

I denne korte artikkelen har vi sett hvordan du kan spørre om enheter ved hjelp av dato og tid-felt med Spring Data JPA.

Vi lærte litt teori før vi brukte Spring Data-mekanismer for å spørre enhetene. Vi så at disse mekanismene fungerer på samme måte med datoer og tider som de gjør med andre typer data.

Kildekoden for denne artikkelen er tilgjengelig på GitHub.


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