Een gids voor Querydsl met JPA

1. Overzicht

Querydsl is een uitgebreid Java-framework dat helpt bij het maken en uitvoeren van typeveilige query's in een domeinspecifieke taal die vergelijkbaar is met SQL.

In dit artikel zullen we Querydsl verkennen met de Java Persistence API.

Een snelle kanttekening hier is dat HQL voor Hibernate de eerste doeltaal was voor Querydsl, maar tegenwoordig ondersteunt het JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections en RDFBean als backends.

2. Voorbereidingen

Laten we eerst de nodige afhankelijkheden toevoegen aan ons Maven-project:

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

En laten we nu de Maven APT-plug-in configureren:

   ... com.mysema.maven apt-maven-plugin 1.1.3 proces doel / gegenereerde-bronnen com.querydsl.apt.jpa.JPAAnnotationProcessor ... 

De JPAAnnotationProcessor vindt domeintypes die zijn geannoteerd met javax.persistence.Entity annotatie en genereert zoektypen voor hen.

3. Query's met Querydsl

Query's worden samengesteld op basis van gegenereerde querytypen die de eigenschappen van uw domeintypen weerspiegelen. Ook functie / methode-aanroepen worden op een volledig typeveilige manier geconstrueerd.

De querypaden en bewerkingen zijn hetzelfde in alle implementaties en ook in het Vraag interfaces hebben een gemeenschappelijke basisinterface.

3.1. Een entiteit en het Querydsl-querytype

Laten we eerst een eenvoudige entiteit definiëren waarvan we gebruik gaan maken terwijl we de voorbeelden doornemen:

@Entity openbare klasse Persoon {@Id @GeneratedValue (strategie = GenerationType.IDENTITY) privé Lange id; @Column private String voornaam; @Column private String achternaam; Person () {} publieke persoon (String voornaam, String achternaam) {this.firstname = voornaam; dit.achternaam = achternaam; } // standaard getters en setters}

Querydsl genereert een zoekopdrachttype met de eenvoudige naam QPersoon in hetzelfde pakket als Persoon. QPerson kan worden gebruikt als een statisch getypte variabele in Querydsl-query's als vertegenwoordiger voor de Persoon type.

Eerste - QPersoon heeft een standaard instantievariabele die toegankelijk is als een statisch veld:

QPerson persoon = QPerson.person;

Als alternatief kunt u uw eigen definiëren Persoon variabelen zoals deze:

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

3.2. Bouw een query met JPAQuery

We kunnen nu gebruiken JPAQuery voorbeelden voor onze vragen:

JPAQuery-query = nieuwe JPAQuery (entityManager);

Merk op dat de entiteitManager is een PPV EntityManager.

Laten we nu alle personen met de voornaam ophalen "Kent”Als een snel voorbeeld:

QPerson persoon = QPerson.person; Lijst personen = query.from (persoon) .where (person.firstName.eq ("Kent")). Lijst (persoon);

De van call definieert de querybron en projectie, de waar deel definieert het filter en lijst vertelt Querydsl om alle overeenkomende elementen te retourneren.

We kunnen ook meerdere filters gebruiken:

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

Of:

query.from (persoon) .where (persoon.voornaam.eq ("Kent"). en (persoon.achternaam.eq ("Beck")));

In native JPQL-vorm zou de query als volgt worden geschreven:

selecteer een persoon uit Persoon als persoon waarbij person.firstName = "Kent" en persoon.achternaam = "Beck"

Als je de filters wilt combineren via “of”, gebruik dan het volgende patroon:

query.from (persoon) .where (persoon.voornaam.eq ("Kent"). of (persoon.achternaam.eq ("Beck")));

4. Ordening en aggregatie in Querydsl

Laten we nu eens kijken hoe ordening en aggregatie werken binnen de Querydsl-bibliotheek.

4.1. Bestellen

We beginnen met het sorteren van onze resultaten in aflopende volgorde door de achternaam veld:

QPerson persoon = QPerson.person; Lijst personen = query.from (persoon) .where (persoon.voornaam.eq (voornaam)) .orderBy (persoon.achternaam.desc ()) .lijst (persoon);

4.2. Aggregatie

Laten we nu een eenvoudige aggregatie gebruiken, aangezien we er een paar beschikbaar hebben (Som, Gem, Max, Min):

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

4.3. Aggregatie met GroupBy

De com.mysema.query.group.GroupBy class biedt aggregatiefunctie die we kunnen gebruiken om queryresultaten in het geheugen te verzamelen.

Hier is een snel voorbeeld waarin het resultaat wordt geretourneerd als Kaart met Voornaam als de sleutel en maximale leeftijd als de waarde:

QPerson persoon = QPerson.person; Kaartresultaten = query.from (persoon) .transform (GroupBy.groupBy (person.firstname) .as (GroupBy.max (person.age)));

5. Testen met Querydsl

Laten we nu een DAO-implementatie definiëren met behulp van Querydsl - en laten we de volgende zoekbewerking definiëren:

openbare lijst findPersonsByFirstnameQuerydsl (String voornaam) {JPAQuery query = nieuwe JPAQuery (em); QPerson persoon = QPerson.person; return query.from (persoon) .where (persoon.voornaam.eq (voornaam)). lijst (persoon); }

Laten we nu een paar tests bouwen met deze nieuwe DAO en Querydsl gebruiken om te zoeken naar nieuw gemaakte Persoon objecten (geïmplementeerd in Personensional class) en in een andere testaggregatie met GroupBy klasse wordt getest:

@Autowired particulier Persoon @Test openbare ongeldig gegevenExistingPersons_whenFindingPersonByFirstName_thenFound () {personão.save (nieuwe persoon ("Erich", "Gamma")); Persoon persoon = nieuwe persoon ("Kent", "Beck"); personensional.save (persoon); personensional.save (nieuwe persoon ("Ralph", "Johnson")); Persoon personFromDb = personbao.findPersonsByFirstnameQuerydsl ("Kent"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test openbare leegte gegevenExistingPersons_whenFindingMaxAgeByName_thenFound () {personão.save (nieuwe persoon ("Kent", "Gamma", 20)); personensional.save (nieuwe persoon ("Ralph", "Johnson", 35)); personensional.save (nieuwe persoon ("Kent", "Zivago", 30)); Kaart maxAge = personensional.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("Ralph")); Assert.assertSame (30, maxAge.get ("Kent")); }

6. Conclusie

Deze tutorial illustreerde hoe je een JPA-project bouwt met Querydsl.

De volledige implementatie van dit artikel is te vinden in het github-project - dit is een op Eclipse gebaseerd maven-project, dus het zou gemakkelijk te importeren en uit te voeren moeten zijn zoals het is.

Een korte opmerking hier is: voer een eenvoudige maven-build uit (mvn clean install) om de typen in doel / gegenereerde-bronnen - en vervolgens, als u Eclipse gebruikt, de map opnemen als een bronmap van het project.


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