En guide til Querydsl med JPA

1. Oversikt

Querydsl er et omfattende Java-rammeverk, som hjelper til med å lage og kjøre typesikre spørsmål på et domenespesifikt språk som ligner på SQL.

I denne artikkelen vil vi utforske Querydsl med Java Persistence API.

En rask sidemerknad her er at HQL for Hibernate var det første målspråket for Querydsl, men i dag støtter den JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections og RDFBean som backends.

2. Forberedelser

La oss først legge til de nødvendige avhengighetene i vårt Maven-prosjekt:

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

Og la oss nå konfigurere Maven APT-plugin:

   ... com.mysema.maven apt-maven-plugin 1.1.3 prosessmål / genererte kilder com.querydsl.apt.jpa.JPAAnnotationProcessor ... 

De JPAAnnotationProcessor finner domenetyper merket med javax.persistence.Entity kommentar og genererer spørringstyper for dem.

3. Spørringer med Querydsl

Spørringer er konstruert basert på genererte spørringstyper som gjenspeiler egenskapene til domenetypene dine. Også funksjon / metodeinnkallelser er konstruert på en fullstendig typesikker måte.

Spørringsbanene og operasjonene er de samme i alle implementeringer og også Spørsmål grensesnitt har et felles basegrensesnitt.

3.1. En enhet og Querydsl-spørringstypen

La oss først definere en enkel enhet vi skal bruke når vi går gjennom eksempler:

@Entity offentlig klasse Person {@Id @GeneratedValue (strategi = GenerationType.IDENTITY) privat Lang id; @Column private Streng fornavn; @Column private String etternavn; Person () {} offentlig person (streng fornavn, streng etternavn) {this.firstname = fornavn; dette. etternavn = etternavn; } // standard getters and setters}

Querydsl vil generere en spørretype med det enkle navnet QPerson inn i samme pakke som Person. QPerson kan brukes som en statisk skrevet variabel i Querydsl-spørringer som representant for Person type.

Først - QPerson har en standard forekomstvariabel som er tilgjengelig som et statisk felt:

QPerson person = QPerson.person;

Alternativt kan du definere din egen Person variabler som dette:

QPerson person = ny QPerson ("Erich", "Gamma");

3.2. Bygg spørring ved hjelp av JPAQuery

Vi kan nå bruke JPAQuery forekomster for spørsmålene våre:

JPAQuery-spørring = ny JPAQuery (entityManager);

Merk at entityManager er en JPA EntityManager.

La oss nå hente alle personene med fornavnet “Kent”Som et raskt eksempel:

QPerson person = QPerson.person; List persons = query.from (person) .where (person.firstName.eq ("Kent")). List (person);

De fra kall definerer spørringskilde og projeksjon, hvor del definerer filteret og liste ber Querydsl om å returnere alle matchede elementer.

Vi kan også bruke flere filtre:

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

Eller:

query.from (person) .where (person.firstName.eq ("Kent"). og (person.sname.eq ("Beck")));

I innfødt JPQL-form ville spørringen bli skrevet slik:

velg person fra person som person der person.firstName = "Kent" og person.sname = "Beck"

Hvis du vil kombinere filtrene via “eller”, bruk følgende mønster:

query.from (person) .where (person.firstName.eq ("Kent"). eller (person.sname.eq ("Beck")));

4. Bestilling og aggregering i Querydsl

La oss nå se på hvordan bestilling og aggregering fungerer i Querydsl-biblioteket.

4.1. Bestilling

Vi begynner med å bestille resultatene i fallende rekkefølge etter etternavn felt:

QPerson person = QPerson.person; Liste personer = spørring. Fra (person). Hvor (person.fornavn.eq (fornavn)) .orderBy (person.navn.desc ()) .liste (person);

4.2. Aggregering

La oss nå bruke en enkel aggregering, ettersom vi har noen få tilgjengelige (Sum, Gj.sn., Maks, Min):

QPerson person = QPerson.person; int maxAge = query.from (person) .liste (person.age.max ()). get (0);

4.3. Aggregering med Gruppe av

De com.mysema.query.group.GroupBy klasse gir aggregeringsfunksjonalitet som vi kan bruke til å samle søkeresultater i minnet.

Her er et raskt eksempel der resultatet returneres som Kart med fornavn som nøkkelen og maks alder som verdien:

QPerson person = QPerson.person; Kartresultater = spørring.fra (person) .transform (GroupBy.groupBy (person.fornavn) .as (GroupBy.max (person.alder)));

5. Testing med Querydsl

La oss nå definere en DAO-implementering ved hjelp av Querydsl - og la oss definere følgende søkeoperasjon:

public List findPersonsByFirstnameQuerydsl (String firstname) {JPAQuery query = new JPAQuery (em); QPerson person = QPerson.person; returner spørring. fra (person). hvor (person.fornavn.eq (fornavn)). liste (person); }

Og la oss nå bygge noen få tester ved hjelp av denne nye DAO, og la oss bruke Querydsl til å søke etter nyopprettede Person objekter (implementert i PersonDao klasse) og i en annen testaggregasjon ved hjelp av Gruppe av klassen er testet:

@Autowired privat PersonDao personDao; @Test offentlig ugyldighet gittExistingPersons_whenFindingPersonByFirstName_thenFound () {personDao.save (ny person ("Erich", "Gamma")); Personperson = ny person ("Kent", "Beck"); personDao.save (person); personDao.save (ny person ("Ralph", "Johnson")); Person personFromDb = personDao.findPersonsByFirstnameQuerydsl ("Kent"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test offentlig ugyldig gittExistingPersons_whenFindingMaxAgeByName_thenFound () {personDao.save (ny person ("Kent", "Gamma", 20)); personDao.save (ny person ("Ralph", "Johnson", 35)); personDao.save (ny person ("Kent", "Zivago", 30)); Kart maxAge = personDao.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("Ralph")); Assert.assertSame (30, maxAge.get ("Kent")); }

6. Konklusjon

Denne opplæringen illustrerte hvordan du bygger JPA-prosjekt ved hjelp av Querydsl.

De full gjennomføring av denne artikkelen finnes i github-prosjektet - dette er et formørkelsesbasert maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.

En rask merknad her er - kjør en enkel maven build (mvn clean install) for å generere typene til mål / genererte kilder - og deretter, hvis du bruker Eclipse - inkluder mappen som en kildemappe for prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found