Jarný údajový dotaz JPA podľa príkladu

1. Úvod

V tejto príručke sa chystáme Naučte sa, ako dopytovať údaje pomocou Spring Data Query podľa príkladu API.

Najskôr definujeme schému údajov, na ktoré sa chceme pýtať. Ďalej preskúmame niekoľko relevantných tried z Spring Data. A potom si ukážeme niekoľko príkladov.

Začnime!

2. Skúšobné údaje

Naše testovacie údaje sú zoznamom mien cestujúcich a sedadla, ktoré obsadili.

Krstné menoPriezviskoČíslo sedadla
JillSmith50
EvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

3. Doména

Vytvorme potrebné jarné dátové úložisko a poskytnime našu doménovú triedu a typ id.

Najprv sme vymodelovali naše Cestujúci ako subjekt JPA:

@Entity class Passenger {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (voliteľné = false) @Column (nullable = false) súkromný reťazec firstName; @Basic (voliteľné = false) @Column (nullable = false) súkromný reťazec priezvisko; @Basic (voliteľné = false) @Column (nullable = false) private int seatNumber; // konštruktor, getri atď.}

Namiesto použitia JPA sme ho mohli vymodelovať ako ďalšiu abstrakciu.

4. Dotaz na príklad API

Najskôr sa pozrime na JpaRepository rozhranie. Ako vidíme, rozširuje sa QueryByExampleExecutor rozhranie na podporu dotazu príkladom:

verejné rozhranie JpaRepository rozširuje PagingAndSortingRepository, QueryByExampleExecutor {}

Toto rozhranie predstavuje viac variantov Nájsť() metóda, ktorú poznáme z Spring Data. Každá metóda však akceptuje aj inštanciu Príklad:

verejné rozhranie QueryByExampleExecutor {Voliteľné findOne (príklad var1); Iterovateľný findAll (príklad var1); Iterovateľný findAll (príklad var1, triediť var2); Stránka findAll (príklad var1, pageable var2); dlhý počet (príklad var1); boolean existuje (príklad var1); }

Po druhé, Príklad rozhranie vystavuje metódy prístupu k sonda a ExampleMatcher.

Je dôležité si uvedomiť, že sonda je príkladom nášho Subjekt:

verejné rozhranie Example {static org.springframework.data.domain.Example of (T probe) {return new TypedExample (probe, ExampleMatcher.matching ()); } static org.springframework.data.domain.Example of (T probe, ExampleMatcher matcher) {return new TypedExample (probe, matcher); } T getProbe (); ExampleMatcher getMatcher (); predvolená trieda getProbeType () {návrat ProxyUtils.getUserClass (this.getProbe (). getClass ()); }}

V súhrne naše sonda a náš ExampleMatcher spoločne špecifikovať náš dopyt.

5. Obmedzenia

Rovnako ako všetky veci, má aj rozhranie Query by Example API určité obmedzenia. Napríklad:

  • Vnorené a zoskupené príkazy nie sú podporované, napríklad: (krstné meno =? 0 a priezvisko =? 1) alebo číslo sedadla = ?2
  • Zodpovedanie reťazcov obsahuje iba presné písmená, nerozlišujú sa malé a veľké písmená, začína, končí, obsahuje a regulárny výraz
  • Všetky typy iné ako String sú iba presnou zhodou

Teraz, keď už trochu poznáme API a jeho obmedzenia, poďme sa teraz venovať niektorým príkladom.

6. Príklady

6.1. Zhoda malých a veľkých písmen

Začnime jednoduchým príkladom a povieme si niečo o predvolenom správaní:

@Test public void givenPassengers_whenFindByExample_thenExpectedReturned () {Príklad príkladu = Príklad.of (Passenger.from ("Fred", "Bloggs", null)); Voliteľné actual = repository.findOne (príklad); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

Najmä statické Example.of () metóda stavia Príklad použitím ExampleMatcher.matching ().

Inými slovami, presná zhoda sa vykoná vo všetkých vlastnostiach, ktoré nie sú platné z Cestujúci. Pri párovaní sa teda pri rozlišovaní veľkých a malých písmen rozlišuje String vlastnosti.

Nebolo by to však príliš užitočné, keby sme mohli robiť iba presnú zhodu všetkých nenulových vlastností.

To je miesto, kde ExampleMatcher vchádza dovnútra. Budovaním našej vlastnej ExampleMatcher, môžeme prispôsobiť správanie tak, aby vyhovovalo našim potrebám.

6.2. Zhoda malých a veľkých písmen

Z tohto dôvodu sa pozrime na ďalší príklad, ktorý je tento krát použitý withIgnoreCase () na dosiahnutie zhody malých a veľkých písmen:

@Test public void givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExectedReturned () {ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll (). WithIgnoreCase (); Príklad example = Example.of (Passenger.from ("fred", "bloggs", null), caseInsensitiveExampleMatcher); Voliteľné actual = repository.findOne (príklad); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

V tomto príklade si všimnite, že sme najskôr volali ExampleMatcher.matchingAll () - má rovnaké správanie ako ExampleMatcher.matching (), ktoré sme použili v predchádzajúcom príklade.

6.3. Vlastné priraďovanie

Môžeme tiež vyladiť správanie nášho porovnávača na základe jednotlivých vlastností a priradiť ľubovoľnú vlastnosť pomocou ExampleMatcher.matchingAny ():

@Test public void givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned () {Passenger jill = Passenger.from ("Jill", "Smith", 50); Passenger eve = Passenger.from ("Eve", "Jackson", 95); Passenger fred = Passenger.from ("Fred", "Bloggs", 22); Passenger siya = Passenger.from ("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 ().) Príklad example = Example.of (Passenger.from ("e", "s", null), customExampleMatcher); Zoznam cestujúcich = repository.findAll (príklad); assertThat (cestujúci, obsahuje (jill, eve, fred, siya)); assertThat (cestujúci, nie (obsahuje (ricki))); }

6.4. Ignorovanie vlastností

Na druhej strane by sme tiež možno chceli dotaz na podmnožinu našich vlastností.

Dosiahneme to ignorovaním niektorých vlastností pomocou ExampleMatcher.ignorePaths (reťazec ... cesty):

@Test public void givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned () {Passenger jill = Passenger.from ("Jill", "Smith", 50); Passenger eve = Passenger.from ("Eve", "Jackson", 95); Passenger fred = Passenger.from ("Fred", "Bloggs", 22); Passenger siya = Passenger.from ("Siya", "Kolisi", 85); Passenger ricki = Passenger.from ("Ricki", "Bobbie", 36); ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.startsWith (). IgnoreCase ()) .withIgnorePaths ("firstName", "seatNumber"); Príklad example = Example.of (Passenger.from (null, "b", null), ignorovanieExampleMatcher); Zoznam cestujúcich = repository.findAll (príklad); assertThat (cestujúci, obsahuje (fred, ricki)); assertThat (cestujúci, nie (obsahuje (jill)); assertThat (cestujúci, nie (obsahuje (predvečer)); assertThat (cestujúci, nie (obsahuje (siya));}

7. Záver

V tomto článku sme si demonštrovali, ako používať rozhranie Query by Example API.

Predviedli sme, ako sa používa Príklad a ExampleMatcher spolu s QueryByExampleExecutor rozhranie na dotazovanie tabuľky pomocou príkladu inštancie údajov.

Na záver môžete nájsť kód na stránkach GitHub.


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