Származtatott lekérdezési módszerek a Spring Data JPA-tárházakban

1. Bemutatkozás

Egyszerű lekérdezések esetén könnyű levezetni, hogy mi legyen a lekérdezés csak úgy, hogy megnézzük a megfelelő metódus nevet a kódunkban.

Ebben az oktatóanyagban azt vizsgáljuk meg, hogy a Spring Data JPA hogyan hasznosítja ezt az ötletet egy módszer elnevezési megállapodás formájában.

2. A származtatott lekérdezési módszerek szerkezete tavasszal

A levezetett módszerneveknek két fő része van, amelyeket az első választ el Által kulcsszó:

A findByName (karakterlánc neve) lista

Az első rész - mint megtalálja - az a bevezető a többi pedig hasonló Név szerint - az a kritériumok.

A Spring Data JPA támogatja megtalálni, olvasni, lekérdezni, számolni és kap. Tehát például megtehettük volna queryByName és a Spring Data ugyanúgy viselkedne.

Használhatjuk is Először is, vagy Felül az ismétlések eltávolításához vagy az eredménykészlet korlátozásához:

List findTop3ByAge ()

A feltételek rész tartalmazza a lekérdezés entitás-specifikus feltételkifejezéseit. Használhatjuk a feltétel kulcsszavakat az entitás tulajdonságneveivel együtt. Összekapcsolhatjuk a kifejezéseket is És és Vagy, valamint pillanatok alatt meglátja.

3. Minta alkalmazás

Először természetesen szükségünk lesz egy alkalmazásra a Spring Data JPA segítségével.

Ebben az alkalmazásban definiáljunk egy entitásosztályt:

@Table (name = "users") @Entity class User {@Id @GeneratedValue private Integer id; privát karakterlánc neve; magán Egész életkor; privát ZonedDateTime birthDate; privát logikai aktív; // szabványos mérőeszközök és beállítók}

És definiáljunk egy adattárat is. Ez meghosszabbodik JpaRepository, a tavaszi adattár egyik típusa:

felület A UserRepository kiterjeszti a JpaRepository {}

Itt helyezzük el az összes származtatott lekérdezési módszerünket.

4. Egyenlőség feltétel kulcsszavak

A pontos egyenlőség a lekérdezések egyik leggyakrabban használt feltétele. Számos lehetőségünk van kifejezni = vagy IS operátorok a lekérdezésben.

Csak hozzáadhatjuk a tulajdonság nevét kulcsszó nélkül a pontos egyezési feltételhez:

List findByName (karakterlánc neve);

És hozzátehetjük Is vagy Egyenlő az olvashatóság érdekében:

List findByNameIs (karakterlánc neve); List findByNameEquals (karakterlánc neve);

Ez az extra olvashatóság jól jön, ha inkább egyenlőtlenséget kell kifejeznünk:

List findByNameIsNot (karakterlánc neve);

Ez egy kicsit olvashatóbb, mint findByNameNot (karakterlánc)!

Mint nulla az egyenlőség különleges eset, nem szabad használni az = operátort. Spring Data JPA kezeli nulla paraméterek alapértelmezés szerint. Tehát, ha elhaladunk a nulla az egyenlőségi feltétel értéke, Spring a lekérdezést IS NULL-ként értelmezi a létrehozott SQL-ben.

Használhatjuk a Nulla kulcsszó az IS NULL feltétel hozzáadásához a lekérdezéshez:

List findByNameIsNull (); List findByNameIsNotNull ();

Ne feledje, hogy egyik sem Nulla sem IsNotNull metódus argumentumot igényel.

Van még két kulcsszó, amelyek nem igényelnek semmilyen érvet. Tudjuk használni Igaz és Hamis kulcsszavak az egyenlőség feltételeinek hozzáadásához logikai típusok:

Lista findByActiveTrue (); List findByActiveFalse ();

Természetesen néha valami enyhébbre vágyunk, mint a pontos egyenlőség, nézzük meg, mit tehetnénk még.

5. Hasonlósági feltétel kulcsszavak

Amikor egy tulajdonság mintájával kell lekérdeznünk az eredményeket, van néhány lehetőségünk.

Találhatunk olyan neveket, amelyek egy értékkel kezdődnek Starting With:

List findByNameStartingWith (karakterlánc előtag);

Nagyjából ez azt jelenti, hogy „HOL név MINT 'érték%'“.

Ha olyan neveket akarunk, amelyek értékkel végződnek, akkor Vége amit akarunk:

List findByNameEndingWith (karakterlánc utótag);

Vagy megtudhatjuk, mely nevek tartalmaznak értéket Tartalmaz:

List findByNameContaining (String infix);

Vegye figyelembe, hogy a fenti feltételeket előre definiált mintakifejezéseknek nevezzük. Így, nem kell hozzáfűznünk % operátor az argumentumon belül amikor ezeket a módszereket hívják.

De tegyük fel, hogy valami összetettebb dolgot csinálunk. Tegyük fel, hogy be kell szereznünk azokat a felhasználókat, akiknek neve egy-vel kezdődik a, tartalmazzák b, és azzal fejezzük be c.

Ehhez hozzáadhatjuk a saját LIKE-t a Mint kulcsszó:

List findByNameLike (String likePattern);

Ezután leadhatjuk a LIKE mintánkat, amikor meghívjuk a módszert:

String likePattern = "a% b% c"; userRepository.findByNameLike (likePattern);

A nevekről egyelőre elég. Próbálkozzunk néhány más értékkel Felhasználó.

6. Összehasonlító állapotkulcsszavak

Továbbá használhatjuk Kevesebb, mint és LessThanEqual kulcsszavak a rekordok összehasonlításához az adott értékkel a < és <= üzemeltetők:

List findByAgeLessThan (Egész kor); List findByAgeLessThanEqual (Egész kor);

Másrészt az ellenkező helyzetben használhatjuk Nagyobb, mint és GreaterThanEqual kulcsszavak:

List findByAgeGreaterThan (egész kor); List findByAgeGreaterThanEqual (Egész életkor);

Vagy találhatunk olyan felhasználókat, akik két év közöttiek Között:

List findByAgeBetween (Integer startAge, Integer endAge);

Kínálhatunk olyan korosztályok gyűjteményét is, amelyek megfelelnek a használatnak Ban ben:

List findByAgeIn (Gyűjtemény korosztályai);

Mivel ismerjük a felhasználók születési dátumát, érdemes megkérdezni azokat a felhasználókat, akik egy adott dátum előtt vagy után születtek. Használnánk Előtt és Utána azért:

List findByBirthDateAfter (ZonedDateTime birthDate); List findByBirthDateBefore (ZonedDateTime birthDate);

7. Több feltételes kifejezés

Annyi kifejezést kombinálhatunk, amire szükségünk van És és Vagy kulcsszavak:

List findByNameOrBirthDate (karakterlánc neve, ZonedDateTime születési dátum); List findByNameOrBirthDateAndActive (karakterlánc neve, ZonedDateTime születési dátum, logikai aktív);

Az elsőbbségi sorrend az És azután Vagy, akárcsak a Java.

Míg a Spring Data JPA nem szab korlátozást arra, hogy hány kifejezést adhatunk hozzá, itt nem szabad megőrülnünk. A hosszú nevek olvashatatlanok és nehezen fenntarthatók. Összetett kérdések esetén vessen egy pillantást a @Lekérdezés annotáció helyett.

8. Az eredmények rendezése

A következő a válogatás. Megkérhetnénk, hogy a felhasználókat ábécé sorrendbe rendezzék a nevük alapján Rendezés:

List findByNameOrderByName (karakterlánc neve); List findByNameOrderByNameAsc (karakterlánc neve);

A növekvő sorrend az alapértelmezett rendezési lehetőség, de használhatjuk Desc ehelyett fordítva rendezze őket:

List findByNameOrderByNameDesc (karakterlánc neve);

9. találj egyet vs. findById a CrudRepository

A tavaszi csapat néhány jelentős változást hajtott végre CrudRepository tavaszi csizmával 2.x. Az egyik az átnevezés találj egyet nak nek findById.

Korábban a Spring Boot 1.x verzióval hívtuk találj egyet amikor egy entitást az elsődleges kulcsával szerettünk volna lekérni:

Felhasználói felhasználó = userRepository.findOne (1);

A Spring Boot 2.x óta ugyanezt megtehetjük findById:

Felhasználói felhasználó = userRepository.findById (1);

Vegye figyelembe, hogy a findById () módszert már meghatározták a CrudRepository nekünk. Tehát nem kell kifejezetten meghatároznunk a kiterjedő egyedi adattárakban CrudRepository.

10. Következtetés

Ebben a cikkben elmagyaráztuk a lekérdezés levezetési mechanizmusát a Spring Data JPA-ban. A tulajdonságfeltétel kulcsszavakkal származtatott lekérdezési módszereket írtunk a Spring Data JPA adattáraiba.

Az oktatóanyag forráskódja a Github projekten érhető el.