Vodič za Querydsl sa JPA
1. Pregled
Querydsl je opsežni Java okvir koji pomaže u stvaranju i pokretanju upiti sigurni za tip na jeziku specifičnom za domenu koji je sličan SQL-u.
U ovom ćemo članku istražiti Querydsl pomoću Java Persistent API-ja.
Kratka napomena ovdje je da je HQL za hibernaciju bio prvi ciljni jezik za Querydsl, ali danas podržava JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections i RDFBean kao pozadinske datoteke.
2. Pripreme
Prvo dodajmo potrebne ovisnosti u naš Maven projekt:
2.5.0 com.querydsl querydsl-apt $ {querydsl.version} pod uvjetom da com.querydsl querydsl-jpa $ {querydsl.version} org.slf4j slf4j-log4j12 1.6.1
A sada konfigurirajmo dodatak Maven APT:
... com.mysema.maven apt-maven-plugin 1.1.3 proces target / generirani izvori com.querydsl.apt.jpa.JPAAnnotationProcessor ...
The JPAAnnotationProcessor pronaći će tipove domena označenih s javax.postojanost.Entitet napomena i generira vrste upita za njih.
3. Upiti s Querydsl
Upiti se grade na temelju generiranih tipova upita koji odražavaju svojstva vaših vrsta domene. Također se pozivi funkcije / metode izrađuju na potpuno siguran način.
Putovi upita i operacije su isti u svim implementacijama, a također i Upit sučelja imaju zajedničko osnovno sučelje.
3.1. Entitet i vrsta upita Querydsl
Prvo definirajmo jednostavan entitet koji ćemo koristiti dok prolazimo kroz primjere:
@ Entiteta javna klasa Osoba {@Id @GeneratedValue (strategija = GenerationType.IDENTITY) private Long id; @Name privatnog niza; @Column private String prezime; Person () {} javna osoba (ime niza, prezime niza) {this.firstname = ime; ovo.prezime = prezime; } // standardni getteri i postavljači}
Querydsl će generirati vrstu upita s jednostavnim nazivom QPerson u isti paket kao Osoba. QPerson može se koristiti kao statički upisana varijabla u upitima Querydsl kao predstavnik za Osoba tip.
Prvo - QPerson ima zadanu varijablu instance kojoj se može pristupiti kao statičkom polju:
QPerson person = QPerson.person;
Alternativno možete definirati vlastiti Osoba varijable poput ove:
QPerson osoba = novi QPerson ("Erich", "Gamma");
3.2. Izrada upita pomoću JPAQuery
Sada možemo koristiti JPAQuery instance za naše upite:
JPAQuery upit = novi JPAQuery (entityManager);
Imajte na umu da entityManager je JPA EntityManager.
Idemo sada dohvatiti sve osobe s imenom “Kent"Kao brzi primjer:
QPerson person = QPerson.person; Popis osoba = query.from (person) .where (person.firstName.eq ("Kent")). List (person);
The iz poziv definira izvor upita i projekciju, gdje dio definira filtar i popis govori Querydslu da vrati sve podudarne elemente.
Također možemo koristiti više filtara:
query.from (person) .where (person.firstName.eq ("Kent"), person.surname.eq ("Beck"));
Ili:
query.from (person) .where (person.firstName.eq ("Kent"). and (person.surname.eq ("Beck")));
U izvornom JPQL obliku upit bi bio napisan ovako:
odaberite osobu iz Osoba kao osobu kod koje je person.firstName = "Kent" i person.surname = "Beck"
Ako želite kombinirati filtre pomoću "ili", upotrijebite sljedeći obrazac:
query.from (person) .where (person.firstName.eq ("Kent"). or (person.surname.eq ("Beck")));
4. Poredak i agregacija u Querydsl
Pogledajmo sada kako funkcioniraju naručivanje i agregiranje u knjižnici Querydsl.
4.1. Naručivanje
Za početak ćemo poredati svoje rezultate u padajućem redoslijedu po prezime polje:
QPerson person = QPerson.person; Popis osoba = upit.od (osoba) .gdje (person.firstname.eq (ime)) .orderBy (person.surname.desc ()) .list (person);
4.2. Zbrajanje
Koristimo sada jednostavno agregiranje, jer imamo nekoliko dostupnih (Zbir, Prosjek, Maks, Min):
QPerson person = QPerson.person; int maxAge = query.from (person) .list (person.age.max ()). get (0);
4.3. Agregacija sa GroupBy
The com.mysema.query.group.GroupBy klasa pruža agregacijsku funkcionalnost koju možemo koristiti za agregiranje rezultata upita u memoriji.
Evo kratkog primjera gdje se rezultat vraća kao Karta s ime kao ključ i maksimalna dob kao vrijednost:
QPerson person = QPerson.person; Rezultati mape = query.from (person) .transform (GroupBy.groupBy (person.firstname) .as (GroupBy.max (person.age)));
5. Testiranje pomoću Querydsla
Sada, definirajmo DAO implementaciju pomoću Querydsl - i definirajmo sljedeću operaciju pretraživanja:
javni popis findPersonsByFirstnameQuerydsl (Ime niza) {JPAQuery query = novi JPAQuery (em); QPerson person = QPerson.person; return query.from (person) .where (person.firstname.eq (firstname)). list (person); }
A sada napravimo nekoliko testova pomoću ovog novog DAO-a i upotrijebimo Querydsl za traženje novostvorenih Osoba objekti (implementirani u PersonDao razred) i u drugom ispitivanju agregacije pomoću GroupBy razred se testira:
@Autowired private PersonDao personDao; @Test javna praznina givenExistingPersons_whenFindingPersonByFirstName_thenFound () {personDao.save (nova Osoba ("Erich", "Gamma")); Osoba osoba = nova osoba ("Kent", "Beck"); personDao.save (osoba); personDao.save (nova osoba ("Ralph", "Johnson")); Osoba personFromDb = personDao.findPersonsByFirstnameQuerydsl ("Kent"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test javna praznina givenExistingPersons_whenFindingMaxAgeByName_thenFound () {personDao.save (nova Osoba ("Kent", "Gamma", 20)); personDao.save (nova osoba ("Ralph", "Johnson", 35)); personDao.save (nova Osoba ("Kent", "Zivago", 30)); Karta maxAge = personDao.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("Ralph")); Assert.assertSame (30, maxAge.get ("Kent")); }
6. Zaključak
Ovaj je vodič ilustrirao kako napraviti JPA projekt pomoću Querydsl.
The puna provedba ovog članka može se naći u github projektu - ovo je maven projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.
Ovdje je kratka napomena - pokrenite jednostavnu maven build (mvn čista instalacija) za generiranje tipova u cilj / generirani izvori - a zatim, ako koristite Eclipse - uključite mapu kao izvornu mapu projekta.