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.