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év | Vezetéknév | Ülésszám |
---|---|---|
Jill | Kovács | 50 |
Éva | Jackson | 94 |
Fred | Bloggs | 22 |
Ricki | Bobbie | 36 |
Siya | Kolisi | 85 |
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.