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.