Izvedene metode upita u spremištima proljetnih podataka JPA
1. Uvod
Za jednostavne upite lako je izvesti kakav bi upit trebao biti samo gledanjem odgovarajućeg naziva metode u našem kodu.
U ovom ćemo uputstvu istražiti kako Spring Data JPA koristi ovu ideju u obliku konvencije o imenovanju metoda.
2. Struktura izvedenih metoda upita u proljeće
Izvedena imena metoda imaju dva glavna dijela odvojena prvim Po ključna riječ:
Popis findByName (naziv niza)
Prvi dio - poput pronaći - je uvoditelj a ostalo - poput Imenom - je kriteriji.
Podržava Spring Data JPA pronađi, pročitaj, postavi upit, broji i dobiti. Tako smo, na primjer, mogli i učiniti queryByName i Spring Data ponašali bi se isto.
Možemo i koristiti Izrazito, prvo, ili Vrh da uklonimo duplikate ili ograničimo naš skup rezultata:
Popis findTop3ByAge ()
Dio kriterija sadrži izraze uvjeta specifične za entitet upita. Ključne riječi stanja možemo koristiti zajedno s imenima entiteta entiteta. Izraze također možemo povezati s I i Ili, kao što vidite za samo trenutak.
3. Primjer uzorka
Prvo, naravno, trebat će nam aplikacija koja koristi Spring Data JPA.
U toj aplikaciji definirajmo klasu entiteta:
@Tabela (name = "users") @Entity class Korisnik {@Id @GeneratedValue private Integer id; privatni naziv niza; privatno Integer doba; privatni ZonedDateTime datum rođenja; private Boolean aktivan; // standardni geteri i postavljači}
I, definirajmo i spremište. Produžit će se JpaRepository, jedna od vrsta spremišta podataka Spring:
sučelje UserRepository proširuje JpaRepository {}
Ovdje ćemo smjestiti sve izvedene metode upita.
4. Ključne riječi ravnopravnosti
Točna jednakost jedan je od najčešće korištenih uvjeta u upitima. Imamo nekoliko mogućnosti za izražavanje = ili IS operatori u upitu.
Možemo jednostavno dodati ime svojstva bez ključne riječi za točno podudaranje:
Popis findByName (naziv niza);
I možemo dodati Je ili Jednako za čitljivost:
Popis findByNameIs (naziv niza); Popis findByNameEquals (naziv niza);
Ova dodatna čitljivost dobro dođe kada umjesto toga moramo izraziti nejednakost:
Popis findByNameIsNot (naziv niza);
Ovo je prilično čitljivo od findByNameNot (String)!
Kao null jednakost je poseban slučaj, ne bismo trebali koristiti operator =. Spring Data JPA ručke null parametri prema zadanim postavkama. Dakle, kad prođemo a null vrijednost za uvjet jednakosti, Spring interpretira upit kao IS NULL u generiranom SQL-u.
Također možemo koristiti IsNull ključna riječ za dodavanje IS NULL kriterija u upit:
Popis findByNameIsNull (); Popis findByNameIsNotNull ();
Imajte na umu ni to IsNull ni IsNotNull zahtijeva argument metode.
Postoje i još dvije ključne riječi koje ne zahtijevaju nikakve argumente. Možemo koristiti Pravi i Lažno ključne riječi za dodavanje uvjeta jednakosti boolean vrste:
Popis findByActiveTrue (); Popis findByActiveFalse ();
Naravno, ponekad želimo nešto blaže od točne jednakosti, da vidimo što još možemo učiniti.
5. Ključne riječi stanja sličnosti
Kad trebamo ispitati rezultate s uzorkom svojstva, imamo nekoliko mogućnosti.
Imena koja počinju s vrijednošću možemo pronaći pomoću Počevši sa:
Popis findByNameStartingWith (prefiks niza);
Otprilike, ovo znači „GDJE Ime KAO 'vrijednost%'“.
Ako želimo imena koja završavaju vrijednošću, tada EndingWith je ono što želimo:
Popis findByNameEndingWith (sufiks niza);
Ili možemo pronaći uz koja imena sadrži vrijednost Sadrži:
Popis findByNameContaining (string infix);
Imajte na umu da se svi gornji uvjeti nazivaju unaprijed definiranim izrazima uzorka. Tako, ne trebamo dodavati % operator unutar argumenta kad se te metode pozovu.
Ali, pretpostavimo da radimo nešto složenije. Recimo da moramo dohvatiti korisnike čija imena počinju s a, sadrže b, i završi s c.
Za to možemo dodati vlastiti LIKE s Kao ključna riječ:
Popis findByNameLike (niz poputPattern);
A tada možemo predati svoj LIKE obrazac kada pozovemo metodu:
Niz poputPattern = "a% b% c"; userRepository.findByNameLike (poputPattern);
Za sada je dosta o imenima. Isprobajmo neke druge vrijednosti u Korisnik.
6. Ključne riječi stanja usporedbe
Nadalje, možemo koristiti Manje od i LessThanEqual ključne riječi za usporedbu zapisa sa zadanom vrijednošću pomoću < i <= operateri:
Popis findByAgeLessThan (cijela dob); Popis findByAgeLessThanEqual (Integer age);
S druge strane, u suprotnoj situaciji možemo koristiti Više nego i Veća od jednake ključne riječi:
Popis findByAgeGreaterThan (cijela dob); Popis findByAgeGreaterThanEqual (cijela dob);
Ili možemo pronaći korisnike koji imaju između dvije dobi Između:
Popis findByAgeBetween (Integer startAge, Integer endAge);
Također možemo dostaviti zbirku dobnih skupina koje se podudaraju s upotrebom U:
Popis findByAgeIn (Zbirka dob);
Budući da znamo rođendan korisnika, možda bismo željeli postaviti upit za korisnike koji su rođeni prije ili nakon određenog datuma. Koristili bismo Prije i Nakon za to:
Popis findByBirthDateAfter (ZonedDateTime birthDate); Popis findByBirthDateBefore (ZonedDateTime datum rođenja);
7. Višestruki izrazi uvjeta
Upotrebom možemo kombinirati onoliko izraza koliko nam je potrebno I i Ili ključne riječi:
Popis findByNameOrBirthDate (ime niza, ZonedDateTime datum rođenja); Popis findByNameOrBirthDateAndActive (Ime niza, ZonedDateTime datum rođenja, logička vrijednost aktivna);
Redoslijed prvenstva je I zatim Ili, baš kao i Java.
Iako Spring Data JPA ne nameće ograničenje koliko izraza možemo dodati, ovdje ne bismo smjeli poludjeti. Duga imena nisu čitljiva i teško ih je održati. Za složene upite pogledajte the @Query umjesto toga bilješka.
8. Sortiranje rezultata
Sljedeće je sortiranje. Mogli bismo tražiti da se korisnici poredaju po abecedi prema imenu Naruči:
Popis findByNameOrderByName (naziv niza); Popis findByNameOrderByNameAsc (naziv niza);
Uzlazni poredak zadana je opcija sortiranja, ali možemo koristiti Desc umjesto da ih sortirate obrnuto:
Popis findByNameOrderByNameDesc (naziv niza);
9. findOne nasuprot findById u CrudRepository
Proljetni tim napravio je neke velike promjene u CrudRepository s Spring Boot 2.x. Jedan od njih je preimenovanje findOne do findById.
Prije bismo nazvali Spring Boot 1.x findOne kada smo željeli dohvatiti entitet prema njegovom primarnom ključu:
Korisnik user = userRepository.findOne (1);
Od Spring Boot 2.x-a možemo učiniti isto s findById:
Korisnik user = userRepository.findById (1);
Imajte na umu da findById () metoda je već definirana u CrudRepository za nas. Stoga ga ne moramo eksplicitno definirati u prilagođenim spremištima koja se proširuju CrudRepository.
10. Zaključak
U ovom smo članku objasnili mehanizam izvođenja upita u Spring Data JPA. Koristili smo ključne riječi stanja svojstva za pisanje izvedenih metoda upita u spremišta Spring Data JPA.
Izvorni kod ovog vodiča dostupan je na projektu Github.