Útmutató a Querydslhez a JPA-val

1. Áttekintés

A Querydsl egy kiterjedt Java keretrendszer, amely segít a létrehozásban és a futtatásban típusbiztonságos lekérdezések az SQL-hez hasonló tartományspecifikus nyelven.

Ebben a cikkben a Querydsl-t vizsgáljuk meg a Java Persistence API-val.

Rövid megjegyzés, hogy a HQL for Hibernate volt az első célnyelv a Querydsl számára, de manapság támogatja a JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections és RDFBean háttérprogramokat.

2. Előkészületek

Először adjuk hozzá a szükséges függőségeket Maven projektünkhöz:

 2.5.0 com.querydsl querydsl-apt $ {querydsl.version} megadott com.querydsl querydsl-jpa $ {querydsl.version} org.slf4j slf4j-log4j12 1.6.1 

Most pedig konfiguráljuk a Maven APT plugint:

   ... com.mysema.maven apt-maven-plugin 1.1.3 folyamat cél / generált források com.querydsl.apt.jpa.JPAAnnotationProcessor ... 

A JPAAnnotationProcessor domaintípusokkal fog megjelölni javax.persistence.Entity megjegyzéseket és lekérdezési típusokat generál számukra.

3. Lekérdezések a Querydsl segítségével

A lekérdezések generált lekérdezési típusok alapján készülnek, amelyek tükrözik a domain típusainak tulajdonságait. A funkció / módszer invokációkat is teljesen típusbiztonságosan állítják össze.

A lekérdezési útvonalak és műveletek minden megvalósításban és a Lekérdezés az interfészeknek közös alapfelületük van.

3.1. Entitás és a Querydsl lekérdezés típusa

Először határozzunk meg egy egyszerű entitást, amelyet használni fogunk, amikor példákat mutatunk be:

@Entity public class Személy {@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private Long id; @Column private String keresztnév; @Column private String vezetéknév; Személy () {} nyilvános Személy (karakterlánc keresztnév, karakterlánc vezetéknév) {this.firstname = keresztnév; ez.név = vezetéknév; } // szokásos mérőeszközök és beállítók}

A Querydsl lekérdezési típust generál az egyszerű névvel QPerson ugyanabba a csomagba, mint Személy. QPerson statikusan beírt változóként használható a Querydsl lekérdezésekben a Személy típus.

Első - QPerson rendelkezik egy alapértelmezett példányváltozóval, amely statikus mezőként érhető el:

QPerson személy = QPerson.person;

Alternatív megoldásként meghatározhatja a sajátját Személy ilyen változók:

QPerson személy = új QPerson ("Erich", "Gamma");

3.2. Lekérdezés készítése JPAQuery

Most már használhatjuk JPAQuery lekérdezéseink példányai:

JPAQuery lekérdezés = new JPAQuery (entityManager);

Vegye figyelembe, hogy a entitáskezelő egy JPA EntityManager.

Most keressük meg az összes keresztnévvel rendelkező személytKent”Gyors példaként:

QPerson személy = QPerson.person; Személyek listája = query.from (személy) .hol (személy. keresztnév.eq ("Kent")). Lista (személy);

A tól től A call meghatározza a lekérdezés forrását és vetületét, a hol rész határozza meg a szűrőt és lista utasítja a Querydsl-t, hogy adja vissza az összes egyező elemet.

Több szűrőt is használhatunk:

query.from (person) .where (person.firstName.eq ("Kent"), person.surname.eq ("Beck"));

Vagy:

query.from (személy) .honnan (person.firstName.eq ("Kent"). és (person.surname.eq ("Beck")));

A natív JPQL formában a lekérdezést így írják:

válasszon személyt a Személy közül személyként, ahol person.firstName = "Kent" és person.surname = "Beck"

Ha a „vagy” jelzéssel kívánja egyesíteni a szűrőket, akkor használja a következő mintát:

query.from (személy) .honnan (person.firstName.eq ("Kent"). vagy (person.surname.eq ("Beck")));

4. Rendelés és összesítés a Querydsl-ben

Most nézzük meg, hogyan működik a rendelés és az összesítés a Querydsl könyvtárban.

4.1. Rendelés

Kezdjük azzal, hogy eredményeinket csökkenő sorrendbe rendezzük a vezetéknév terület:

QPerson személy = QPerson.person; Személyek felsorolása = lekérdezés.-tól (személy) .hová (személy. keresztnév.eq (keresztnév)) .orderBy (személy. vezetéknév.desc ()).

4.2. Összesítés

Használjunk most egy egyszerű összesítést, mivel néhány elérhető (Összeg, Átl., Max. Min.):

QPerson személy = QPerson.person; int maxAge = query.from (személy) .list (person.age.max ()). get (0);

4.3. Összesítés Csoportosít

A com.mysema.query.group.GroupBy osztály összesítési funkciókat biztosít, amelyek segítségével lekérdezési eredményeket összesíthetünk a memóriában.

Itt egy rövid példa, ahol az eredményt a következőképpen adjuk vissza Térkép val vel keresztnév mint kulcs és max életkor értékként:

QPerson személy = QPerson.person; Térkép eredmények = query.from (személy) .transform (GroupBy.groupBy (személy. keresztnév) .as (GroupBy.max (person.age)));

5. Tesztelés Querydsl segítségével

Most definiáljunk egy DAO implementációt a Querydsl segítségével - és definiáljuk a következő keresési műveletet:

public List findPersonsByFirstnameQuerydsl (String utónév) {JPAQuery lekérdezés = new JPAQuery (em); QPerson személy = QPerson.person; return query.from (személy) .honnan (személy. keresztnév.eq (keresztnév)). lista (személy); }

Most építsünk néhány tesztet az új DAO használatával, és a Querydsl segítségével keressük meg az újonnan létrehozottakat Személy objektumok (megvalósítva: PersonDao osztály) és egy másik teszt-összesítésben a Csoportosít osztály tesztelve:

@ Meghatalmazott magánszemélyDao personDao; @Test public void givenExistingPersons_whenFindingPersonByFirstName_thenFound () {personDao.save (new Person ("Erich", "Gamma")); Személy személy = új Személy ("Kent", "Beck"); personDao.save (személy); personDao.save (új Személy ("Ralph", "Johnson")); Person personFromDb = personDao.findPersonsByFirstnameQuerydsl ("Kent"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test public void givenExistingPersons_whenFindingMaxAgeByName_thenFound () {personDao.save (new Person ("Kent", "Gamma", 20)); personDao.save (új Személy ("Ralph", "Johnson", 35)); personDao.save (új Személy ("Kent", "Zivago", 30)); Térkép maxAge = personDao.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("Ralph")); Assert.assertSame (30, maxAge.get ("Kent")); }

6. Következtetés

Ez az oktatóanyag bemutatta, hogyan lehet felépíteni a JPA projektet a Querydsl segítségével.

A teljes végrehajtása A cikk e része megtalálható a github projektben - ez egy Eclipse alapú maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.

Itt egy rövid megjegyzés: futtasson egy egyszerű maven összeállítást (mvn clean install) a típusok generálásához cél / generált-források - majd, ha az Eclipse programot használja, akkor a mappát vegye fel a projekt forrásmappájaként.