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.