Spring Data JPA lekérdezés példával

1. Bemutatkozás

Ebben az oktatóanyagban fogunk megtanulhatja, hogyan kell lekérdezni az adatokat a Spring Data Query by Example API segítségével.

Először meghatározzuk a lekérdezni kívánt adatok sémáját. Ezután megvizsgálunk néhány releváns osztályt a Spring Data-ból. És akkor átfutunk néhány példát.

Kezdjük el!

2. A tesztadatok

Tesztadataink felsorolják az utasok nevét, valamint az általuk elfoglalt helyet.

KeresztnévVezetéknévÜlésszám
JillKovács50
ÉvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

3. Domain

Hozzuk létre a szükséges tavaszi adattárat, és adjuk meg tartományosztályunkat és azonosítótípust.

Először is modelleztük a sajátunkat Utas mint JPA-entitás:

@Entity class Passenger {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (opcionális = hamis) @Column (nullable = hamis) privát karakterlánc keresztnév; @Basic (opcionális = hamis) @Column (nullable = hamis) privát karakterlánc vezetéknév; @Basic (opcionális = hamis) @Column (nullable = hamis) private int seatNumber; // kivitelező, szerelők stb.}

A JPA helyett egy másik absztrakcióként modellezhetnénk.

4. Lekérdezés az API példa segítségével

Először vessünk egy pillantást a JpaRepository felület. Mint láthatjuk kiterjeszti a QueryByExampleExecutor interfész a lekérdezés támogatására példával:

nyilvános felület A JpaRepository kiterjeszti a PagingAndSortingRepository, QueryByExampleExecutor {}

Ez a felület a megtalálja() módszer, amelyet a Spring Data-ból ismerünk. Mindegyik módszer azonban elfogadja a Példa:

nyilvános felület QueryByExampleExecutor {Opcionális findOne (példa var1); Iterable findAll (var1 példa); Iterable findAll (var1 példa, var2 rendezés); Page findAll (var1 példa, lapozható var2 példa); hosszú számolás (var1 példa); logikai érték létezik (var1 példa); }

Másodszor, a Példa Az interfész kiteszi a metódusokat a szonda és a ExampleMatcher.

Fontos felismerni, hogy a szonda a mi példánk Entitás:

nyilvános felület Példa {static org.springframework.data.domain.Példa (T próba) {return new TypedExample (probe, ExampleMatcher.matching ()); } static org.springframework.data.domain.Példa (T próba, ExampleMatcher illesztő) {return new TypedExample (próba, illesztő); } T getProbe (); ExampleMatcher getMatcher (); alapértelmezett osztály getProbeType () {return ProxyUtils.getUserClass (this.getProbe (). getClass ()); }}

Összefoglalva, a mi szonda és a mi ExampleMatcher együtt adjuk meg a lekérdezésünket.

5. Korlátozások

Mint minden dolog, a Query by Example API is tartalmaz bizonyos korlátozásokat. Például:

  • A beszúrási és csoportosítási utasítások nem támogatottak, például: (keresztnév =? 0 és vezetéknév =? 1) vagy ülésszám = ?2
  • A karakterlánc-illesztés csak a pontos, a kis- és nagybetűk megkülönböztetését, kezdetét, végét, tartalmát és regexét tartalmazza
  • Minden típus, kivéve: Húr csak pontos egyezésűek

Most, hogy kicsit jobban ismerjük az API-t és annak korlátait, merítsünk néhány példát.

6. Példák

6.1. Kis- és nagybetű különbség

Kezdjük egy egyszerű példával, és beszéljünk az alapértelmezett viselkedésről:

@Test public void givenPassengers_whenFindByExample_thenExpectedReturned () {Példa példa = példa (Passenger.from ("Fred", "Bloggs", null)); Választható tényleges = repository.findOne (példa); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), tényleges.get ()); }

Különösen a statikus Például() módszer épít egy Példa felhasználásával ExampleMatcher.matching ().

Más szavakkal, pontos egyezést végeznek minden nem null tulajdonsággal nak,-nek Utas. Így az egyeztetés a kis- és nagybetűk között van Húr tulajdonságait.

Azonban nem lenne túl hasznos, ha csak pontos illesztést tehetnénk az összes nem null tulajdonságra.

Itt van a ExampleMatcher bejön a saját építésével ExampleMatcher, testre szabhatjuk a viselkedést igényeinknek megfelelően.

6.2. Kis- és nagybetűk nélküli egyezés

Ezt szem előtt tartva nézzünk meg egy másik példát, amelyet ezúttal használunk withIgnoreCase () a kis- és nagybetűk közötti egyezés elérése:

@Test public void givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExpectedReturned () {ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll (). WithIgnoreCase (); Példa példa = Example.of (Passenger.from ("fred", "bloggs", null), caseInsensitiveExampleMatcher); Választható tényleges = repository.findOne (példa); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), tényleges.get ()); }

Ebben a példában vegye észre, hogy először hívtunk ExampleMatcher.matchingAll () - ugyanúgy viselkedik, mint ExampleMatcher.matching (), amelyet az előző példában használtunk.

6.3. Egyéni egyezés

Azt is megtehetjük hangolja párosunk viselkedését ingatlanonként és bármilyen tulajdonságot egyeztetni a használatával ExampleMatcher.matchingAny ():

@Test public void givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned () {Passenger jill = Passenger.from ("Jill", "Smith", 50); Utas előestéje = Utas. Innen ("Eve", "Jackson", 95); Passenger fred = Passenger.from ("Fred", "Bloggs", 22); Utas siya = Utas. Innen ("Siya", "Kolisi", 85); Passenger ricki = Passenger.from ("Ricki", "Bobbie", 36); ExampleMatcher customExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("firstName", ExampleMatcher.GenericPropertyMatchers.contains (). IgnoreCase ()) .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.contains (). (Tartalmaz). Példa példa = példa (Passenger.from ("e", "s", null), customExampleMatcher); Listázza az utasokat = repository.findAll (példa); assertThat (utasok tartalmazzák (jill, eve, fred, siya)); assertThat (utasok, nem (tartalmaz (ricki))); }

6.4. A tulajdonságok figyelmen kívül hagyása

Másrészt mi is csak szeretnénk lekérdezés tulajdonságaink egy részhalmazán.

Ezt úgy érjük el, hogy figyelmen kívül hagyjuk néhány tulajdonság használatát ExampleMatcher.ignorePaths (String… elérési utak):

@Test public void givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned () {Passenger jill = Passenger.from ("Jill", "Smith", 50); Utas előestéje = Utas. Innen ("Eve", "Jackson", 95); Passenger fred = Passenger.from ("Fred", "Bloggs", 22); Utas siya = Utas. Innen ("Siya", "Kolisi", 85); Passenger ricki = Passenger.from ("Ricki", "Bobbie", 36); ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("vezetéknév", ExampleMatcher.GenericPropertyMatchers.startsWith (). IgnoreCase ()) .withIgnorePaths ("keresztnév", "ülésszám"); Példa példa = Example.of (Passenger.from (null, "b", null), ignoringExampleMatcher); Listázza az utasokat = repository.findAll (példa); assertThat (utasok, tartalmaz (fred, ricki)); assertThat (utasok, nem (tartalmaz (jill)); assertThat (utasok, nem (tartalmazza (eve)); assertThat (utasok nem (tartalmaz (siya));}

7. Következtetés

Ebben a cikkben bemutattuk a Query by Example API használatát.

Bemutattuk, hogyan kell használni Példa és ExampleMatcher együtt a QueryByExampleExecutor felület egy táblázat lekérdezéséhez egy példapéldány használatával.

Összefoglalva: a kódot a GitHubon találja meg.