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.


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