LIKE lekérdezések a JPA tavaszi adattáraiban

1. Bemutatkozás

Ebben a gyors bemutatóban a LIKE lekérdezések létrehozásának különféle módjait fogjuk áttekinteni a tavaszi JPA-tárházakban.

Kezdjük azzal, hogy megvizsgáljuk a különféle kulcsszavakat, amelyeket a lekérdezési módszerek létrehozása során használhatunk. Majd kitérünk a @Lekérdezés megjegyzés megnevezett és rendezett paraméterekkel.

2. Beállítás

Példánkban lekérdezzük a film asztal.

Határozzuk meg a sajátunkat Film entitás:

@Entity public class Movie {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private Long id; privát húr cím; privát vonósigazgató; privát String minősítés; magán int időtartam; // szabványos mérőeszközök és beállítók}

Velünk Film definiált entitás, hozzunk létre néhány minta beszúrási utasítást:

INSERT INTO film (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (1, 'Godzilla: A szörnyek királya', 'Michael Dougherty', 'PG-13', 132); INSERT INTO film (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (2, 'Bosszúállók: Végjáték', 'Anthony Russo', 'PG-13', 181); INSERT INTO film (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (3, „Marvel kapitány”, „Boden Anna”, „PG-13”, 123); INSERT INTO film (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (4, 'Dumbo', 'Tim Burton', 'PG', 112); INSERT INTO movie (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (5, 'Booksmart', 'Olivia Wilde', 'R', 102.); INSERT INTO movie (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (6, 'Aladdin', 'Guy Ritchie', 'PG', 128); INSERT INTO film (azonosító, cím, rendező, értékelés, időtartam) ÉRTÉKEK (7, „A nap is csillag”, „Ry Russo-Young”, „PG-13”, 100);

3. LIKE Lekérdezési módszerek

Sok egyszerű LIKE lekérdezési forgatókönyv esetén különféle kulcsszavak előnyeit kihasználva lekérdezési módszereket hozhatunk létre tárhelyeinkben.

Fedezzük fel őket most.

3.1. Tartalmaz, Tartalmaz, Tartalmaz és Mint

Nézzük meg, hogyan tudjuk végrehajtani a következő LIKE lekérdezést egy lekérdezési módszerrel:

KIVÁLASZTÁS * FROM filmből WHERE LIKE cím:%% -ban%;

Először definiáljuk a lekérdezési módszereket a Tartalmaz, Tartalmaz, és Tartalmaz:

List findByTitleContaining (karakterlánc címe); List findByTitleContains (karakterlánc címe); List findByTitleIsContaining (karakterlánc címe);

Hívjuk meg lekérdezési módszereinket a részcímmel ban ben:

Eredmények felsorolása = filmRepository.findByTitleContaining ("in"); assertEquals (3, eredmények.méret ()); eredmények = filmRepository.findByTitleIsContaining ("in"); assertEquals (3, eredmények.méret ()); eredmények = filmRepository.findByTitleContains ("be"); assertEquals (3, eredmények.méret ());

Arra számíthatunk, hogy a három módszer mindegyike ugyanazt az eredményt adja.

A tavasz biztosítja számunkra a Mint kulcsszó, de kissé másként viselkedik, mivel a helyettesítő karaktert meg kell adnunk a keresési paraméterünkkel.

Definiáljunk egy LIKE lekérdezési módszert:

List findByTitleLike (karakterlánc címe);

Most hívjuk a mi telefonunkat findByTitleLike módszer ugyanazzal az értékkel, amelyet korábban használtunk, de tartalmazza a helyettesítő karaktereket:

eredmények = filmRepository.findByTitleLike ("% -ban%"); assertEquals (3, eredmények.méret ());

3.2. Kezdődik

Most nézzük meg a következő lekérdezést:

KIVÁLASZTÁS * FROM Movie WHERE besorolás, mint „PG%”;

Használjuk a Kezdődik kulcsszó a lekérdezési módszer létrehozásához:

List findByRatingStartsWith (String besorolás);

Meghatározott módszerünkkel hívjuk az értékkel PG:

Eredménylista = movieRepository.findByRatingStartsWith ("PG"); assertEquals (6, eredmények.méret ());

3.3. Végződik

A tavasz ellentétes funkcionalitást biztosít számunkra a Végződik kulcsszó.

Vegyük fontolóra ezt a lekérdezést:

SELECT * FROM Movie WHERE rendező, mint „% Burton”;

Most definiáljunk egy Végződik lekérdezési módszer:

List findByDirectorEndsWith (karakterlánc-igazgató);

Miután meghatároztuk a módszerünket, nevezzük a Burton paraméter:

Eredmények felsorolása = movieRepository.findByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());

3.4. Esetérzékenység

Gyakran meg akarjuk találni az összes olyan rekordot, amely tartalmaz egy adott karakterláncot, az esettől függetlenül. SQL-ben ezt úgy tehetjük meg, hogy rákényszerítjük az oszlopot az összes nagy- vagy kisbetűre, és megadjuk ugyanezt az általunk lekérdezett értékekkel.

A tavaszi JPA-val használhatjuk a IgnoreCase kulcsszó egy másik kulcsszóval kombinálva:

List findByTitleContainingIgnoreCase (karakterlánc címe);

Most a metódussal hívhatjuk a és számíthat arra, hogy mind az alsó, mind a nagybetűs eredményeket tartalmazza:

Eredmények felsorolása = movieRepository.findByTitleContainingIgnoreCase ("a"); assertEquals (2, eredmények.méret ());

3.5. Nem

Néha meg akarjuk találni az összes olyan rekordot, amely nem tartalmaz egy adott karakterláncot. Használhatjuk a NotContains, NotContaining, és Nem mint kulcsszavak.

Definiáljunk egy lekérdezést a segítségével Nem tartalmaz filmeket találni olyan értékelésekkel, amelyek nem tartalmaznak PG:

List findByRatingNotContaining (String minősítés);

Most hívjuk meg újonnan definiált módszerünket:

Eredmények felsorolása = movieRepository.findByRatingNotContaining ("PG"); assertEquals (1, results.size ());

Ha olyan funkciót szeretnénk elérni, amely olyan rekordokat talál, amelyekben a rendező nem egy adott karakterlánccal indul, használjuk a Nem mint kulcsszó a vadkártya-elhelyezés felett történő ellenőrzés megtartásához:

List findByDirectorNotLike (String igazgató);

Végül hívjuk meg a módszert, hogy megtaláljuk az összes filmet, ahol a rendező neve mással kezdődik An:

Eredménylista = filmRepository.findByDirectorNotLike ("An%"); assertEquals (5, eredmények.méret ());

Tudjuk használni Nem mint hasonló módon teljesíteni a Nem kombinálva a Végződik fajta funkcionalitás.

4. Használata @Lekérdezés

Néha olyan lekérdezéseket kell létrehoznunk, amelyek túl bonyolultak a Lekérdezési módszerek számára, vagy abszurd módon hosszú metódusneveket eredményeznének. Ezekben az esetekben használhatjuk a @Lekérdezés kommentár az adatbázisunk lekérdezéséhez.

4.1. Elnevezett paraméterek

Hozzunk létre összehasonlítás céljából egy lekérdezést, amely egyenértékű a findByTitleContaining módszer, amelyet korábban definiáltunk:

@Query ("SELECT m FROM Movie m WHERE m.title LIKE%: title%") Lista kereséseByTitleLike (@Param ("title") karakterlánc címe);

Az általunk megadott lekérdezésbe felvesszük a helyettesítő karaktereket. A @Param az annotáció itt fontos, mert megnevezett paramétert használunk.

4.2. Rendezett paraméterek

A megnevezett paraméterek mellett rendezett paramétereket is használhatunk lekérdezéseinkben:

@Query ("SELECT m FROM Movie m WHERE m.rating LIKE? 1%") List searchByRatingStartsWith (String rating);

Rendelkezünk a helyettesítő karakterekkel, ezért ez a lekérdezés megegyezik a findByRatingStartsWith lekérdezési módszer.

Találjuk meg az összes filmet, amelynek kezdőbetűje kezdődik PG:

Eredmények felsorolása = movieRepository.searchByRatingStartsWith ("PG"); assertEquals (6, eredmények.méret ());

Ha nem megbízható adatokkal rendelkező LIKE lekérdezésekben rendezett paramétereket használunk, akkor meg kell kerülnünk a bejövő keresési értékeket.

Ha a Spring Boot 2.4.1 vagy újabb verziót használjuk, használhatjuk a SpEL-t menekülni módszer:

@Query ("SELECT m FROM Movie m WHERE m.director LIKE%? # {Escape ([0])} escape? # {EscapeCharacter ()}" ") List searchByDirectorEndsWith (String director);

Most hívjuk meg módszerünket az értékkel Burton:

Eredménylista = filmRepository.searchByDirectorEndsWith ("Burton"); assertEquals (1, results.size ());

5. Következtetés

Ebben a rövid bemutatóban megtanultuk, hogyan hozhatunk létre LIKE lekérdezéseket a JPA tavaszi adattáraiban.

Először megtanultuk, hogyan kell használni a megadott kulcsszavakat a lekérdezési módszerek létrehozásához. Ezután megtanultuk, hogyan hajtsuk végre ugyanazokat a feladatokat a @Lekérdezés paraméter megnevezett és rendezett paraméterekkel egyaránt.

A teljes példakód elérhető a GitHubon.