LIKE dotazy na jar v úložiskách JPA

1. Úvod

V tomto rýchlom výučbe sa budeme zaoberať rôznymi spôsobmi vytvárania LIKE dotazov v úložiskách JPA na jar.

Začneme tým, že sa pozrieme na rôzne kľúčové slová, ktoré môžeme použiť pri vytváraní metód dotazu. Potom pokryjeme @Dopyt anotácia s pomenovanými a zoradenými parametrami.

2. Inštalácia

Pre náš príklad budeme dopytovať a film stôl.

Definujme si svoje Film subjekt:

@Entity public class Movie {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private Long id; súkromný názov reťazca; súkromný riaditeľ reťazca; súkromné ​​hodnotenie reťazcov; trvanie súkromného int; // štandardné getre a setre}

S našim Film definovaná entita, vytvorme niekoľko ukážkových príkazov vloženia:

VLOŽTE DO filmu (id, titul, režisér, hodnotenie, trvanie) HODNOTY (1, 'Godzilla: King of the Monsters', 'Michael Dougherty', 'PG-13', 132); VLOŽTE DO filmu (id, titul, režisér, hodnotenie, trvanie) HODNOTY (2, „Avengers: Endgame“, „Anthony Russo“, „PG-13“, 181); VLOŽTE DO filmu (id, titul, režisér, hodnotenie, trvanie) HODNOTY (3, „Captain Marvel“, „Anna Boden“, „PG-13“, 123); VLOŽTE DO filmu (id, titul, režisér, hodnotenie, doba trvania) HODNOTY (4, 'Dumbo', 'Tim Burton', 'PG', 112); VLOŽTE DO filmu (ID, názov, režisér, hodnotenie, trvanie) HODNOTY (5, „Booksmart“, „Olivia Wilde“, „R“, 102); VLOŽTE DO filmu (id, titul, režisér, hodnotenie, trvanie) HODNOTY (6, 'Aladdin', 'Guy Ritchie', 'PG', 128); VLOŽTE DO filmu (id, titul, režisér, hodnotenie, trvanie) HODNOTY (7, „Slnko je tiež hviezda“, „Ry Russo-Young“, „PG-13“, 100);

3. LIKE Dotazové metódy

Pre mnoho jednoduchých scenárov LIKE dotazu môžeme na vytvorenie metód dotazu v našich úložiskách využiť rôzne kľúčové slová.

Poďme ich teraz preskúmať.

3.1. Obsahujúce, Obsahuje, Obsahuje a Páči sa mi to

Pozrime sa, ako môžeme vykonať nasledujúci LIKE dotaz pomocou metódy dotazu:

VYBRAŤ * Z filmu, KDE TITULKA AKO '% v%';

Najskôr definujme metódy dotazu pomocou Obsahujúce, Obsahuje, a Obsahuje:

Zoznam findByTitleContaining (názov reťazca); Zoznam findByTitleContains (názov reťazca); Zoznam findByTitleIsContaining (názov reťazca);

Zavolajme naše metódy dotazu s čiastočným nadpisom v:

Zoznam výsledkov = movieRepository.findByTitleContaining ("in"); assertEquals (3, results.size ()); results = movieRepository.findByTitleIsContaining ("in"); assertEquals (3, results.size ()); results = movieRepository.findByTitleContains ("in"); assertEquals (3, results.size ());

Môžeme očakávať, že každá z troch metód vráti rovnaké výsledky.

Jar nám poskytuje aj a Páči sa mi to kľúčové slovo, ale správa sa trochu odlišne v tom, že sme povinní poskytnúť nášmu parametru vyhľadávania zástupný znak.

Poďme definovať LIKE metódu dotazu:

Zoznam findByTitleLike (názov reťazca);

Teraz, nazvime to náš findByTitleLike metóda s rovnakou hodnotou, ktorú sme použili predtým, ale vrátane zástupných znakov:

results = movieRepository.findByTitleLike ("% v%"); assertEquals (3, results.size ());

3.2. Začína s

Teraz sa pozrime na nasledujúci dotaz:

VYBERTE * Z FILMU, KDE hodnotenie ako 'PG%';

Použime Začína s kľúčové slovo na vytvorenie metódy dotazu:

Zoznam findByRatingStartsWith (hodnotenie reťazca);

S našou definovanou metódou to nazvime s hodnotou PG:

Zoznam výsledkov = movieRepository.findByRatingStartsWith ("PG"); assertEquals (6, results.size ());

3.3. Končí sa

Jar nám poskytuje opačnú funkčnosť ako Končí sa kľúčové slovo.

Zvážme tento dotaz:

VYBERTE * Z filmu, KDE režisér ako 'Burton';

Teraz definujme Končí sa metóda dotazu:

Zoznam findByDirectorEndsWith (riaditeľ reťazca);

Keď sme definovali našu metódu, nazvime ju pomocou Burton parameter:

Zoznam výsledkov = movieRepository.findByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());

3.4. Necitlivosť na malé a veľké písmená

Často chceme nájsť všetky záznamy obsahujúce určitý reťazec bez ohľadu na prípad. V SQL by sme to mohli dosiahnuť tak, že vynútime stĺpec na všetky veľké alebo malé písmená a poskytneme to isté s hodnotami, ktoré dotazujeme.

S jarným JPA môžeme použiť IgnoreCase kľúčové slovo v kombinácii s jedným z našich ďalších kľúčových slov:

Zoznam findByTitleContainingIgnoreCase (názov reťazca);

Teraz môžeme metódu zavolať pomocou the a očakávajte, že získate výsledky obsahujúce malé aj veľké výsledky:

Zoznam výsledkov = movieRepository.findByTitleContainingIgnoreCase ("the"); assertEquals (2, results.size ());

3.5. Nie

Niekedy chceme nájsť všetky záznamy, ktoré neobsahujú konkrétny reťazec. Môžeme použiť Neobsahuje, Neobsahujúce, a Nie ako kľúčové slová.

Definujme dopyt pomocou Neobsahujúce nájsť filmy s hodnotením, ktoré neobsahujú PG:

Zoznam findByRatingNotContaining (hodnotenie reťazca);

Teraz nazvime našu novo definovanú metódu:

Zoznam výsledkov = movieRepository.findByRatingNotContaining ("PG"); assertEquals (1, results.size ());

Na dosiahnutie funkčnosti, ktorá nájde záznamy, kde režisér nezačína konkrétnym reťazcom, použijeme znak Nie ako kľúčové slovo, aby sme si udržali kontrolu nad umiestnením našej zástupnej karty:

Zoznam findByDirectorNotLike (riaditeľ reťazca);

Na záver nazvime metódu vyhľadania všetkých filmov, kde meno režiséra začína niečím iným ako An:

Zoznam výsledkov = movieRepository.findByDirectorNotLike ("An%"); assertEquals (5, results.size ());

Môžeme použiť Nie ako podobným spôsobom dosiahnuť a Nie v kombinácii s Končí sa druh funkčnosti.

4. Používanie @Dopyt

Niekedy potrebujeme vytvoriť dotazy, ktoré sú pre Query Methods príliš komplikované alebo by priniesli absurdne dlhé názvy metód. V týchto prípadoch môžeme použiť @Dopyt anotácia na dopytovanie našej databázy.

4.1. Pomenované parametre

Pre porovnanie vytvorme dotaz, ktorý je ekvivalentný s findByTitleContaining metóda, ktorú sme definovali skôr:

@Query ("VYBERTE m Z FILMU m KDE m.title LIKE%: title%") List searchByTitleLike (@Param ("title") Názov reťazca);

Do dotazu, ktorý dodávame, zahrňujeme naše zástupné znaky. The @Param anotácia je tu dôležitá, pretože používame pomenovaný parameter.

4.2. Objednané parametre

Okrem pomenovaných parametrov môžeme v dotazoch použiť objednané parametre:

@Query ("VYBERTE m Z filmu m KDE m.rating LIKE? 1%") Zoznam hľadaniaByRatingStartsWith (hodnotenie reťazca);

Máme kontrolu nad svojimi zástupnými znakmi, takže tento dopyt je ekvivalentom znaku findByRatingStartsWith metóda dotazu.

Poďme nájsť všetky filmy s hodnotením začínajúcim na PG:

Zoznam výsledkov = movieRepository.searchByRatingStartsWith ("PG"); assertEquals (6, results.size ());

Keď použijeme zoradené parametre v LIKE dotazoch s nedôveryhodnými údajmi, mali by sme uniknúť prichádzajúcim hodnotám vyhľadávania.

Ak používame Spring Boot 2.4.1 alebo novší, môžeme použiť SpEL uniknúť metóda:

@Query ("VYBERTE m Z filmu m KDE m.director LIKE%? # {Uniknúť ([0])} uniknúť? # {UniknúťCharakter ()}")) list searchByDirectorEndsWith (reťazec);

Teraz nazvime našu metódu s hodnotou Burton:

Zoznam výsledkov = movieRepository.searchByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());

5. Záver

V tomto krátkom tutoriáli sme sa naučili, ako vytvoriť LIKE dotazy v úložiskách JPA na jar.

Najprv sme sa naučili, ako používať poskytnuté kľúčové slová na vytváranie metód dotazovania. Potom sme sa naučili, ako dosiahnuť rovnaké úlohy pomocou nástroja @Dopyt parameter s menovanými aj zoradenými parametrami.

Celý príklad kódu je k dispozícii na GitHub.


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