LIKE Upiti u proljetnim JPA spremištima
1. Uvod
U ovom ćemo brzom vodiču pokriti različite načine stvaranja LIKE upita u proljetnim JPA spremištima.
Za početak ćemo pogledati razne ključne riječi koje možemo koristiti tijekom stvaranja metoda upita. Zatim ćemo pokriti @Query napomena s imenovanim i poredanim parametrima.
2. Postavljanje
Za naš ćemo primjer upitati a film stol.
Definirajmo svoje Film entitet:
@ Entity public class Movie {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private Long id; privatni naslov niza; privatni gudački redatelj; ocjena privatnog niza; privatno int trajanje; // standardni geteri i postavljači}
S našim Film entitet definiran, kreirajmo neke primjere izjava za umetanje:
INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (1, 'Godzilla: King of the Monsters', 'Michael Dougherty', 'PG-13', 132); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (4, 'Dumbo', 'Tim Burton', 'PG', 112); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (5, 'Booksmart', 'Olivia Wilde', 'R', 102); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (6, 'Aladdin', 'Guy Ritchie', 'PG', 128); INSERT INTO film (id, naslov, redatelj, ocjena, trajanje) VRIJEDNOSTI (7, 'Sunce je i zvijezda', 'Ry Russo-Young', 'PG-13', 100);
3. LIKE metode upita
Za mnoge jednostavne scenarije LIKE upita možemo iskoristiti razne ključne riječi za stvaranje metoda upita u našim spremištima.
Istražimo ih sada.
3.1. Sadrži, Sadrži, Sadrži i Kao
Pogledajmo kako možemo izvršiti sljedeći LIKE upit pomoću metode upita:
ODABERITE * IZ filma GDJE naslov KAO '% u%';
Prvo, definirajmo metode upita pomoću Sadrži, Sadrži, i Sadrži:
Popis findByTitleContaining (naslov niza); Popis findByTitleContains (naslov niza); Popis findByTitleIsContaining (naslov niza);
Nazovimo naše metode upita s djelomičnim naslovom u:
Popis rezultata = movieRepository.findByTitleContaining ("u"); assertEquals (3, results.size ()); results = movieRepository.findByTitleIsContaining ("u"); assertEquals (3, results.size ()); rezultati = movieRepository.findByTitleContains ("u"); assertEquals (3, results.size ());
Možemo očekivati da će svaka od tri metode vratiti iste rezultate.
Proljeće nam također pruža a Kao ključna riječ, ali ponaša se ponešto drugačije jer moramo nadoknadivom znaku pružiti naš parametar pretraživanja.
Definirajmo metodu LIKE upita:
Popis findByTitleLike (naslov niza);
Sada, nazovimo naše findByTitleLike metoda s istom vrijednošću koju smo koristili prije, ali uključujući zamjenske znakove:
rezultati = movieRepository.findByTitleLike ("% u%"); assertEquals (3, results.size ());
3.2. Počinje sa
Pogledajmo sada sljedeći upit:
ODABERITE * IZ filma GDJE Ocjena KAO 'PG%';
Iskoristimo Počinje sa ključna riječ za izradu metode upita:
Popis findByRatingStartsWith (ocjena niza);
Kad je definirana naša metoda, nazovimo je s vrijednošću PG:
Popis rezultata = movieRepository.findByRatingStartsWith ("PG"); assertEquals (6, results.size ());
3.3. Završava s
Proljeće nam pruža suprotnu funkcionalnost s Završava s ključna riječ.
Razmotrimo ovaj upit:
ODABERI * IZ filma GDJE redatelj KAO '% Burton';
Sada, definirajmo Završava s metoda upita:
Popis findByDirectorEndsWith (redatelj niza);
Nakon što definiramo našu metodu, nazovimo je s Burton parametar:
Popis rezultata = movieRepository.findByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());
3.4. Neosjetljivost na slučaj
Često želimo pronaći sve zapise koji sadrže određeni niz, bez obzira na slučaj. U SQL-u bismo to mogli postići prisiljavanjem stupca na velika i mala slova i pružanjem istog vrijednostima koje ispitujemo.
S Spring JPA možemo koristiti IgnoreCase ključna riječ u kombinaciji s jednom od naših ostalih ključnih riječi:
Popis findByTitleContainingIgnoreCase (naslov niza);
Sada metodu možemo nazvati s the i očekujte da ćete dobiti rezultate koji sadrže i mala i velika slova:
Popis rezultata = movieRepository.findByTitleContainingIgnoreCase ("the"); assertEquals (2, results.size ());
3.5. Ne
Ponekad želimo pronaći sve zapise koji ne sadrže određeni niz. Možemo koristiti NotSadrži, Ne sadrži, i Ne kao ključne riječi za to.
Definirajmo upit pomoću NotContain pronaći filmove s ocjenama koje ne sadrže PG:
Popis findByRatingNotContaining (ocjena niza);
Nazovimo sada našu novo definiranu metodu:
Popis rezultata = movieRepository.findByRatingNotContaining ("PG"); assertEquals (1, results.size ());
Da bismo postigli funkcionalnost koja pronalazi zapise kod kojih redatelj ne započinje određenim nizom, upotrijebimo Ne kao ključna riječ za zadržavanje kontrole nad našim nadmetanjem:
Popis findByDirectorNotLike (redatelj niza);
Na kraju, nazovimo metodu kako bismo pronašli sve filmove u kojima redateljevo ime započinje nečim drugim An:
Popis rezultata = movieRepository.findByDirectorNotLike ("An%"); assertEquals (5, results.size ());
Možemo koristiti Ne kao na sličan način postići a Ne u kombinaciji s Završava s vrsta funkcionalnosti.
4. Korištenje @Query
Ponekad moramo stvoriti upite koji su prekomplicirani za metode upita ili bi rezultirali apsurdno dugim imenima metoda. U tim slučajevima, možemo koristiti @Query napomena za upit naše baze podataka.
4.1. Imenovani parametri
Za usporedbu, napravimo upit koji je ekvivalentan findByTitleContaining metoda koju smo prethodno definirali:
@Query ("SELECT m FROM Movie m WHERE m.title LIKE%: title%") Popis searchByTitleLike (@Param ("title") Naslov niza);
Naše zamjenske znakove uključujemo u upit koji isporučujemo. The @Param napomena je ovdje važna jer koristimo imenovani parametar.
4.2. Poredani parametri
Pored imenovanih parametara, u našim upitima možemo koristiti poredane parametre:
@Query ("SELECT m FROM Movie m WHERE m.rating LIKE? 1%") Popis searchByRatingStartsWith (ocjena niza);
Imamo nadzor nad našim zamjenskim znakovima, tako da je ovaj upit ekvivalentan findByRatingStartsWith metoda upita.
Pronađimo sve filmove s ocjenom koja počinje s PG:
Popis rezultata = movieRepository.searchByRatingStartsWith ("PG"); assertEquals (6, results.size ());
Kada koristimo poredane parametre u LIKE upitima s nepouzdanim podacima, trebali bismo izbjeći dolazne vrijednosti pretraživanja.
Ako koristimo Spring Boot 2.4.1 ili noviju verziju, možemo koristiti SpEL pobjeći metoda:
@Query ("SELECT m FROM Movie m WHERE m.director LIKE%? # {Escape ([0])} escape? # {EscapeCharacter ()}") Popis searchByDirectorEndsWith (Direktor niza);
Nazovimo sada našu metodu s vrijednošću Burton:
Popis rezultata = movieRepository.searchByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());
5. Zaključak
U ovom kratkom vodiču naučili smo kako stvoriti LIKE upite u proljetnim JPA spremištima.
Prvo smo naučili kako koristiti navedene ključne riječi za izradu metoda upita. Zatim smo naučili kako izvršavati iste zadatke pomoću @Query parametar s imenovanim i poredanim parametrima.
Cjelovit primjer koda dostupan je na GitHubu.