Triedenie pomocou JPA

1. Prehľad

Tento článok ilustruje rôzne spôsoby Na triedenie je možné použiť JPA.

2. Triedenie pomocou JPA / JQL API

Používanie JQL na triedenie sa deje pomocou Zoradiť podľa doložka:

Reťazec jql; Dotaz na dopyt = entityManager.createQuery (jql);

Na základe tohto dotazu generuje JPA nasledujúci priamy údaj Príkaz SQL:

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.name ako name2_4_ z Foo foo0_ zoradiť podľa foo0_.id

Upozorňujeme, že kľúčové slová SQL v reťazci JQL nerozlišujú veľké a malé písmená, ale názvy entít a ich atribúty áno.

2.1. Nastavenie poradia triedenia

Predvolene poradie triedenia stúpa, ale dá sa to výslovne nastaviť v reťazci JQL. Rovnako ako v prípade čistého SQL sú možnosti usporiadania asc a popis:

Reťazec jql = "Vyberte f z Foo ako f poradie podľa f.id desc"; Dotaz sortQuery = entityManager.createQuery (jql);

The vygenerovaný dotaz SQL potom bude obsahovať smer objednávky:

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.name ako name2_4_ z Foo foo0_ zoradiť podľa foo0_.id desc

2.2. Triedenie podľa viac ako jedného atribútu

Ak ich chcete zoradiť podľa viacerých atribútov, pridajú sa k order by klauzula reťazca JQL:

Reťazec jql; Dotaz sortQuery = entityManager.createQuery (jql);

Obidve podmienky triedenia sa zobrazia v vygenerovaný dotaz SQL vyhlásenie:

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.name ako name2_4_ z Foo foo0_ zoradiť podľa foo0_.name asc, foo0_.id desc

2.3. Nastavenie priority triedenia nulových hodnôt

Predvolená priorita núl je špecifická pre databázu, ale je možné ju upraviť pomocou PRVÉ NULY alebo NULLS POSLEDNÉ klauzula v reťazci dotazu HQL.

Tu je jednoduchý príklad - zoradenie podľa názov z Foo v zostupnom poradí a umiestnení Nulovýs na konci:

Query sortQuery = entityManager.createQuery ("Vyberte f z Foo ako f poradie podľa f.name desc NULLS POSLEDNÉ");

Vygenerovaný dotaz SQL obsahuje je nula koncová klauzula 1 else 0 (3. riadok):

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.BAR_ID ako BAR_ID2_4_, foo0_.bar_Id ako bar_Id2_4_, foo0_.name ako name3_4_, z Foo foo0_ poradie v prípade, keď foo0_.name je null, potom 1 iný 0 koniec, foo0

2.4. Radenie jedného do mnohých vzťahov

Keď sa presunieme okolo základných príkladov, pozrime sa teraz na prípad použitia triedenie entít vo vzťahu jedna k mnohýmBar obsahujúci zbierku Foo subjekty.

Chceme triediť Bar subjekty a tiež ich zbierka Foo subjekty - JPA je pre túto úlohu obzvlášť jednoduchý:

  1. Triedenie zbierky: Pridať Zoradiť podľa anotácia pred Foo zbierka v Bar subjekt:
    @OrderBy ("názov ASC") Zoznam fooList;
  2. Triedenie entity obsahujúcej zbierku:
    Reťazec jql = "Vyberte b z pruhu ako b poradie podľa b.id"; Dotaz barQuery = entityManager.createQuery (jql); Zoznam barList = barQuery.getResultList ();

Všimnite si, že @Zoradiť podľa anotácia je voliteľná, ale v tomto prípade ju používame, pretože chceme triediť Foo zbierka každého Bar.

Poďme sa pozrieť na SQL dotaz zaslané do RDMS:

Hibernácia: vyberte bar0_.id ako id1_0_, bar0_.name ako meno2_0_ z baru bar0_ zoradiť podľa bar0_.id Hibernate: vyberte foolist0_.BAR_ID ako BAR_ID2_0_0_, foolist0_.id ako id1_4_0_, foolist0_.ID ako f______1______ .bar_Id ako bar_Id2_4_1_, foolist0_.name ako meno3_4_1_ z Foo foolist0_ kde foolist0_.BAR_ID =? zoradiť podľa foolist0_.name vz 

Prvý dotaz triedi rodiča Bar subjekt. Druhý dopyt sa vygeneruje na triedenie zbierky potomkov Foo subjekty patriace do Bar.

3. Triedenie pomocou rozhrania API dotazu JPA Criteria Object

S kritériami JPA - zoradiť podľa Metóda je alternatívou "na jednom mieste" k nastaveniu všetkých parametrov triedenia: oba smer objednávky a atribúty triediť podľa možno nastaviť. Nasleduje API tejto metódy:

  • zoradiť podľa(CriteriaBuilder.asc): Zoradiť vzostupne.
  • zoradiť podľa(CriteriaBuilder.desc): Zoradiť zostupne.

Každý objednať inštancia je vytvorená pomocou C.riteriaBuilder objekt prostredníctvom jeho asc alebo popis metódy.

Tu je rýchly príklad - triedenie Foos ich názov:

CriteriaQuery kritériáQuery = kritériaBuilder.createQuery (Foo.class); Root from = criteriaQuery.from (Foo.class); CriteriaQuery select = kritériaQuery.select (od); riteriaQuery.orderBy (criteriaBuilder.asc (from.get ("name")));

Argument k geMetóda t rozlišuje veľké a malé písmená, pretože sa musí zhodovať s názvom atribútu.

Na rozdiel od jednoduchého JQL, API JPA Criteria Query Object vynúti výslovný smer objednávky v dotaze. V poslednom riadku tohto útržku kódu si všimnite, že kritériáBuilder objekt špecifikuje poradie triedenia vzostupne volaním jeho asc metóda.

Keď sa vykoná vyššie uvedený kód, JPA vygeneruje dotaz SQL uvedený nižšie. Objekt kritérií JPA generuje príkaz SQL s explicitným údajom asc doložka:

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.name ako name2_4_ z Foo foo0_ zoradiť podľa foo0_.name asc

3.1. Triedenie podľa viac ako jedného atribútu

Ak chcete zoradiť viac ako jeden atribút, jednoducho odovzdajte znak objednať inštancia do zoradiť podľa metóda pre každý atribút zoradiť podľa.

Tu je rýchly príklad - zoradenie podľa názov a id, v asc a popis poradie, respektíve:

CriteriaQuery kritériáQuery = kritériaBuilder.createQuery (Foo.class); Root from = criteriaQuery.from (Foo.class); CriteriaQuery select = kritériaQuery.select (od); riteriaQuery.orderBy (criteriaBuilder.asc (from.get ("name")), criteriaBuilder.desc (from.get ("id")));

Zodpovedajúci dopyt SQL je uvedený nižšie:

Hibernácia: vyberte foo0_.id ako id1_4_, foo0_.name ako name2_4_ z Foo foo0_ zoradiť podľa foo0_.name asc, foo0_.id desc

4. Záver

Tento článok skúma alternatívy triedenia v rozhraní Java Persistence API pre jednoduché entity aj pre entity vo vzťahu jedna k mnohým. Tieto prístupy delegujú záťaž z triediacich prác na databázovú vrstvu.

Implementáciu tohto Triedenia JPA nájdete v projekte GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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