Primjer Spring JPA upita podataka

1. Uvod

U ovom uputstvu idemo naučite kako tražiti podatke pomoću Spring Data Query by Example API.

Prvo ćemo definirati shemu podataka koje želimo postavljati. Dalje ćemo ispitati nekoliko relevantnih klasa iz Spring Data. A onda ćemo proći kroz nekoliko primjera.

Započnimo!

2. Podaci o ispitivanju

Naši testni podaci su popis imena putnika kao i sjedište koje su zauzeli.

ImePrezimeBroj sjedala
JillSmith50
PredvečerjeJackson94
FredBloggovi22
RickiBobbie36
SiyaKolisi85

3. Domena

Stvorimo spremište podataka Spring koje nam treba i pružimo klasu domene i tip id-a.

Za početak smo modelirali naš Putnik kao JPA entitet:

@Entity class Putnik {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (neobavezno = false) @Column (nullable = false) private String firstName; @Basic (nije obavezno = netačno) @Column (nullable = false) private String lastName; @Basic (neobavezno = false) @Column (nullable = false) private int seatNumber; // konstruktor, getteri itd.}

Umjesto da koristimo JPA, mogli smo ga modelirati kao drugu apstrakciju.

4. Upit prema primjeru API-ja

Prvo, pogledajmo JpaRepository sučelje. Kao što vidimo proširuje QueryByExampleExecutor sučelje za podršku upitu na primjeru:

javno sučelje JpaRepository proširuje PagingAndSortingRepository, QueryByExampleExecutor {}

Ovo sučelje uvodi više varijanti pronaći() metoda koja nam je poznata iz Spring Data. Međutim, svaka metoda također prihvaća primjerak Primjer:

javno sučelje QueryByExampleExecutor {Neobvezno findOne (Primjer var1); Iterable findAll (Primjer var1); Iterable findAll (Primjer var1, sortiranje var2); Stranica findAll (Primjer var1, varljiva stranica2); dugo brojanje (Primjer var1); boolean postoji (Primjer var1); }

Drugo, Primjer sučelje izlaže metode za pristup sonda i ExampleMatcher.

Važno je shvatiti da sonda je primjer našeg Entitet:

javno sučelje Primjer {static org.springframework.data.domain.Example (T sonda) {return new TypedExample (sonda, ExampleMatcher.matching ()); } statički org.springframework.data.domain.Primjer za (T sonda, ExampleMatcher podudaranje) {return new TypedExample (sonda, podudaranje); } T getProbe (); ExampleMatcher getMatcher (); zadana klasa getProbeType () {return ProxyUtils.getUserClass (this.getProbe (). getClass ()); }}

Ukratko, naš sonda i naše ExampleMatcher zajedno navesti naš upit.

5. Ograničenja

Kao i sve stvari, Query by Example API ima neka ograničenja. Na primjer:

  • Izjave za gniježđenje i grupiranje nisu podržane, na primjer: (ime =? 0 i prezime =? 1) ili broj sjedala = ?2
  • Podudaranje nizova uključuje samo točno, bez velikih i malih slova, započinje, završava, sadrži i regularni izraz
  • Sve vrste osim Niz se točno podudaraju

Sad kad smo malo upoznati API i njegova ograničenja, zaronimo u neke primjere.

6. Primjeri

6.1. Podudaranje velikih i malih slova

Počnimo s jednostavnim primjerom i razgovarajmo o zadanom ponašanju:

@Test javna praznina givenPassengers_whenFindByExample_thenExpectedReturned () {Primjer primjera = Example.of (Passenger.from ("Fred", "Bloggs", null)); Neobvezno actual = repository.findOne (primjer); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

Konkretno, statički Primjer.of () metoda gradi an Primjer koristeći ExampleMatcher.matching ().

Drugim riječima, izvršit će se točno podudaranje na svim ne-null svojstvima od Putnik. Dakle, podudaranje razlikuje velika i mala slova Niz Svojstva.

Međutim, ne bi bilo previše korisno da sve što možemo učiniti je točno podudaranje svih ne-null svojstava.

Ovdje je ExampleMatcher ulazi. Izgrađujući vlastiti ExampleMatcher, ponašanje možemo prilagoditi svojim potrebama.

6.2. Podudaranje bez velikih i malih slova

Imajući to na umu, pogledajmo još jedan primjer, ovaj put koristeći withIgnoreCase () kako bi se postiglo podudaranje bez velikih i malih slova:

@Test javna praznina givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExpectedReturned () {ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll (). WithIgnoreCase (); Primjer primjera = Example.of (Passenger.from ("fred", "bloggs", null), caseInsensitiveExampleMatcher); Neobvezno actual = repository.findOne (primjer); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

U ovom primjeru primijetite da smo prvo nazvali ExampleMatcher.matchingAll () - ponaša se isto kao i ExampleMatcher.matching (), koji smo koristili u prethodnom primjeru.

6.3. Prilagođeno podudaranje

Možemo i mi prilagodite ponašanje našeg podudarnika na osnovi svojstva i podudaraju se s bilo kojim svojstvom pomoću ExampleMatcher.matchingAny ():

@Test javna praznina givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned () {Putnik jill = Passenger.from ("Jill", "Smith", 50); Putničko predvečerje = Passenger.from ("Eve", "Jackson", 95); Putnik fred = Passenger.from ("Fred", "Bloggs", 22); Putnička sija = Passenger.from ("Siya", "Kolisi", 85); Putnički ricki = Passenger.from ("Ricki", "Bobbie", 36); ExampleMatcher customExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("firstName", ExampleMatcher.GenericPropertyMatchers.contains (). IgnoreCase ()) .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.contains (). Primjer primjera = Example.of (Passenger.from ("e", "s", null), customExampleMatcher); Popis putnika = repozitorij.findAll (primjer); assertThat (putnici, sadrži (jill, eve, fred, siya)); assertThat (putnici, a ne (sadrži (ricki))); }

6.4. Zanemarivanje svojstava

S druge strane, možda također samo želimo upit o podskupini naših svojstava.

To postižemo ignoriranjem nekih svojstava pomoću ExampleMatcher.ignorePaths (String ... staze):

@Test javna praznina givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned () {Putnik jill = Passenger.from ("Jill", "Smith", 50); Putničko predvečerje = Passenger.from ("Eve", "Jackson", 95); Putnik fred = Passenger.from ("Fred", "Bloggs", 22); Putnička sija = Passenger.from ("Siya", "Kolisi", 85); Putnički ricki = Passenger.from ("Ricki", "Bobbie", 36); ExampleMatcher ignorirajućiExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.startsWith (). IgnoreCase ()) .withIgnorePaths ("firstName", "seatNumber"); Primjer primjera = Example.of (Passenger.from (null, "b", null), ignorirajućiExampleMatcher); Popis putnika = repozitorij.findAll (primjer); assertThat (putnici, sadrži (fred, ricki)); assertThat (putnici, ne (sadrži (jill)); assertThat (putnici, ne (sadrži (eve)); assertThat (putnici, ne (sadrži (siya));}

7. Zaključak

U ovom smo članku pokazali kako se koristi Query by Example API.

Pokazali smo kako se koristi Primjer i ExampleMatcher zajedno sa QueryByExampleExecutor sučelje za upit tablice pomoću primjera podatkovne instance.

U zaključku, kod možete pronaći na GitHubu.