Sprievodca dotazom na dotaz s JPA

1. Prehľad

Querydsl je rozsiahly rámec Java, ktorý pomáha pri vytváraní a chode typovo bezpečné dotazy v jazyku špecifickom pre doménu, ktorý je podobný SQL.

V tomto článku preskúmame Querydsl s rozhraním Java Persistence API.

Krátka poznámka je, že HQL pre Hibernate bol prvým cieľovým jazykom pre Querydsl, ale dnes podporuje ako backend JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections a RDFBean.

2. Prípravy

Najprv do nášho projektu Maven pridáme potrebné závislosti:

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

A teraz nakonfigurujme doplnok Maven APT:

   ... com.mysema.maven apt-maven-plugin 1.1.3 cieľ procesu / generované zdroje com.querydsl.apt.jpa.JPAAnnotationProcessor ... 

The JPAAnnotationProcessor nájde typy domén s poznámkami javax.persistence.Entity anotáciu a generuje pre ne typy dotazov.

3. Dotazy s Querydsl

Dotazy sú zostavené na základe vygenerovaných typov dotazov, ktoré odrážajú vlastnosti vašich typov domén. Tiež vyvolania funkcií / metód sú konštruované spôsobom úplne bezpečným pre typ.

Cesty a operácie dotazu sú rovnaké vo všetkých implementáciách a tiež v serveri Dopyt rozhrania majú spoločné základné rozhranie.

3.1. Entita a typ dotazu Querydsl

Najprv si definujeme jednoduchú entitu, ktorú použijeme pri prechádzaní príkladmi:

@Entity verejná trieda Osoba {@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private Long id; @ Stĺpec súkromné ​​meno reťazca; @ Stĺpec súkromné ​​reťazec priezvisko; Person () {} public Person (String firstname, String surname) {this.firstname = firstname; this.surname = priezvisko; } // štandardní zakladatelia a zakladatelia}

Querydsl vygeneruje typ dotazu s jednoduchým názvom QPerson do rovnakého balíka ako Osoba. QPerson môže byť použitý ako staticky zadaná premenná v dotazoch Querydsl ako zástupca pre Osoba typu.

Najprv - QPerson má predvolenú premennú inštancie, ku ktorej je možné pristupovať ako k statickému poľu:

Osoba QPerson = QPerson.person;

Prípadne môžete definovať svoje vlastné Osoba premenné ako toto:

Osoba QPerson = nový QPerson ("Erich", "Gamma");

3.2. Zostaviť dopyt pomocou JPAQuery

Teraz môžeme použiť JPAQuery inštancie pre naše dotazy:

JPAQuery query = nový JPAQuery (entityManager);

Všimnite si, že entityManager je JPA EntityManager.

Poďme teraz získať všetky osoby s menom “Kent”Ako rýchly príklad:

Osoba QPerson = QPerson.person; Zoznam osôb = dopyt.od (osoba). Kde (osoba.prve meno.Eq ("Kent")). Zoznam (osoba);

The od volanie definuje zdroj dotazu a projekciu, kde časť definuje filter a zoznam povie Querydsl, aby vrátil všetky zhodné prvky.

Môžeme tiež použiť viac filtrov:

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

Alebo:

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

V natívnej forme JPQL by bol dopyt napísaný takto:

vyberte osobu z Osoby ako osobu, kde person.firstName = "Kent" a person.surname = "Beck"

Ak chcete filtre kombinovať pomocou „alebo“, použite nasledujúci vzor:

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

4. Objednávanie a agregácia v Querydsl

Poďme sa teraz pozrieť na to, ako funguje objednávanie a agregácia v knižnici Querydsl.

4.1. Objednávanie

Začneme zoradením našich výsledkov v zostupnom poradí podľa priezvisko lúka:

Osoba QPerson = QPerson.person; Zoznam osôb = dopyt.od (osoba). Kde [osoba.prstne meno.eq (meno)) .orderBy (osoba.surname.desc ()) .list (osoba);

4.2. Agregácia

Poďme teraz použiť jednoduchú agregáciu, pretože máme k dispozícii niekoľko (súčet, priemer, max, min):

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

4.3. Agregácia s GroupBy

The com.mysema.query.group.GroupBy trieda poskytuje agregačné funkcie, ktoré môžeme použiť na agregáciu výsledkov dotazu do pamäte.

Tu je rýchly príklad, keď sa výsledok vráti ako Mapa s krstné meno ako kľúč a maximálny vek ako hodnota:

Osoba QPerson = QPerson.person; Výsledky na mape = query.from (person) .transform (GroupBy.groupBy (person.firstname) .as (GroupBy.max (person.age))));

5. Testovanie pomocou Querydsl

Teraz definujme implementáciu DAO pomocou Querydsl - a definujme nasledujúcu operáciu vyhľadávania:

verejný zoznam findPersonsByFirstnameQuerydsl (meno reťazca) {JPAQuery dotaz = nový JPAQuery (em); Osoba QPerson = QPerson.person; návratový dotaz.od ​​(osoba) .kde (osoba.prve meno.eq (meno)). zoznam (osoba); }

A teraz poďme zostaviť niekoľko testov pomocou tohto nového DAO a pomocou Querydsl budeme hľadať novo vytvorené Osoba objekty (implementované v PersonDao triedy) a v inej agregácii testov pomocou GroupBy trieda je testovaná:

@Autowired private PersonDao personDao; @Test public void givenExistingPersons_whenFindingPersonByFirstName_thenFound () {personDao.save (nová osoba ("Erich", "gama")); Osoba osoba = nová osoba ("Kent", "Beck"); personDao.save (osoba); personDao.save (nová Osoba ("Ralph", "Johnson")); Osoba personFromDb = personDao.findPersonsByFirstnameQuerydsl ("Kent"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test public void givenExistingPersons_whenFindingMaxAgeByName_thenFound () {personDao.save (nová osoba ("Kent", "Gamma", 20)); personDao.save (nová Osoba ("Ralph", "Johnson", 35)); personDao.save (nová Osoba ("Kent", "Zivago", 30)); Mapa maxAge = personDao.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("Ralph")); Assert.assertSame (30, maxAge.get ("Kent")); }

6. Záver

Tento tutoriál ilustroval, ako zostaviť projekt JPA pomocou Querydsl.

The úplná implementácia tohto článku nájdete v projekte github - jedná sa o projekt maven založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

Tu je krátka poznámka - spustite jednoduché zostavenie maven (mvn clean install) na vygenerovanie typov cieľ / generované zdroje - a potom, ak používate Eclipse - zahrňte priečinok ako zdrojový priečinok projektu.


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