Triedenie pomocou režimu dlhodobého spánku

1. Prehľad

Tento článok ilustruje ako triediť s režimom dlhodobého spánku, ktorý používa Hibernate Query Language (HQL) a Criteria API.

2. Triedenie pomocou HQL

Triedenie pomocou Hibernate HQL je také jednoduché ako pridanie Zoradiť podľa doložka k reťazcu dotazu HQL:

Reťazec hql = "Z Foo f OBJEDNÁVKA PODĽA f.name"; Dotaz na dotaz = sess.createQuery (hql);

Po vykonaní tohto kódu vygeneruje režim dlhodobého spánku nasledujúci dopyt SQL:

Hibernácia: vyberte foo0_.ID ako ID1_0_, foo0_.NAME ako NAME2_0_ z FOO foo0_ zoradiť podľa foo0_.NAME

Predvolený smer poradia zoradenia je vzostupný. Z tohto dôvodu je stav objednávky, asc, nie je zahrnutý vo vygenerovanom dotaze SQL.

2.1. Použitie explicitného poradia triedenia

Ak chcete zadať poradie triedenia ručne - budete musieť zahrnúť smer poradia do HQL reťazec dotazu:

Reťazec hql = "ZO Foo f OBJEDNAŤ NA f.name ASC"; Dotaz na dotaz = sess.createQuery (hql);

V tomto príklade je nastavenie asc klauzula v HQL bola zahrnutá do vygenerovaného SQL dotazu:

Hibernácia: vyberte foo0_.ID ako ID1_0_, foo0_.NAME ako NAME2_0_ z FOO foo0_ zoradiť podľa foo0_.NAME ASC

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

Do priečinka. Je možné pridať viac atribútov spolu s voliteľným radením Zoradiť podľa klauzula v reťazci dotazu HQL:

Reťazec hql = "ZO Foo f OBJEDNAŤ NA f.name DESC, f.id ASC"; Dotaz na dotaz = sess.createQuery (hql);

Vygenerovaný dotaz SQL sa príslušne zmení:

Hibernácia: vyberte foo0_.ID ako ID1_0_, foo0_.NAME ako NAME2_0_ z FOO foo0_ zoradiť podľa foo0_.NAME DESC, foo0_.ID ASC

2.3. Nastavenie priority triedenia nulových hodnôt

Predvolene, keď má atribút na zoradenie nulový hodnôt, je na RDMS, aby rozhodol o prednosti. Toto predvolené zaobchádzanie je možné prepísať umiestnením a PRVÉ NULY alebo NULLS POSLEDNÉ klauzula v reťazci dotazu HQL.

Tento jednoduchý príklad umiestni akékoľvek nuly na koniec zoznamu výsledkov:

Reťazec hql = "OD Foo f OBJEDNAŤ PODĽA f.name NULLS POSLEDNÉ"; Dotaz na dotaz = sess.createQuery (hql);

Pozrime sa na je null potom 1 iné 0 doložka v vygenerovaný dotaz SQL:

Hibernácia: vyberte foo0_.ID ako ID1_1_, foo0_.NAME ako NAME2_1_, foo0_.BAR_ID ako BAR_ID3_1_, foo0_.idx ako idx4_1_ z FOO foo0_ zoradiť podľa prípadov, keď foo0_.NAME je null, potom 1 iný 0 koniec, foo0_.NAME

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

Poďme analyzovať zložitý prípad triedenia: triedenie entít vo vzťahu jedna k mnohýmBar obsahujúci zbierku Foo subjekty.

Urobíme to tak, že zbierku anotujeme zimný spánok @Zoradiť podľa anotácia; upresníme pole, ktorým sa objednávanie vykonáva, ako aj smer:

@OrderBy (clause = "NAME DESC") Nastaviť fooList = nový HashSet ();

Všimni si doložka argument k anotácii. Toto je jedinečné pre režim dlhodobého spánku @Zoradiť podľa, v porovnaní s podobnými @Zoradiť podľa Anotácia JPA. Ďalšou charakteristikou, ktorá odlišuje tento prístup od ekvivalentu JPA, je to, že doložka Argument naznačuje, že triedenie sa vykonáva na základe NÁZOV stĺpec FOO stôl, nie na názov atribút Foo.

Teraz sa pozrime na skutočné triedenie Bary a Foos:

Reťazec hql = "Z pruhu b OBJEDNAŤ podľa b.id"; Dotaz na dotaz = sess.createQuery (hql);

The výsledný príkaz SQL ukazuje, že zoradené Foo sú umiestnené v a fooList:

Hibernácia: vyberte bar0_.ID ako ID1_0_, bar0_.NAME ako NAME2_0_ z BAR bar0_ zoradenie podľa bar0_.ID Hibernate: vyberte foolist0_.BAR_ID ako BAR_ID3_0_0_, foolist0_.ID ako ID1_1_0_, foolist0_.ID ako ID1_1__0_f_ ako ID1_1__0 .BAR_ID ako BAR_ID3_1_1_, foolist0_.idx ako idx4_1_1_ z FOO foolist0_ kde foolist0_.BAR_ID =? zoradiť podľa foolist0_.NAME desc

Je potrebné mať na pamäti jednu vec nie je možné triediť Zoznamy ako to bolo v prípade JPA. V dokumentácii k režimu dlhodobého spánku sa uvádza:

„Hibernácia momentálne ignoruje @OrderBy na @ElementCollection napr. Zoznam. Poradie prvkov je vrátené databázou, nedefinované. “

Ako vedľajšia poznámka je možné toto obmedzenie obísť použitím staršej konfigurácie XML pre režim dlhodobého spánku a nahradením prvok s a element.

3. Triedenie podľa kritérií dlhodobého spánku

Criteria Object API poskytuje objednať triedy ako hlavný API na správu triedenia.

3.1. Nastavenie poradia triedenia

The objednať trieda má dva spôsoby nastavenia poradia triedenia:

  • asc(Atribút reťazca) : Zoradí dopyt podľa atribút vzostupne.
  • popis(Atribút reťazca) : Zoradí dopyt podľa atribút v zostupnom poradí.

Začnime jednoduchým príkladom - zoradením podľa jediného id atribút:

Kritériá kritérií = sess.createCriteria (Foo.class, "FOO"); kritériá.addOrder (Order.asc ("id"));

Všimnite si, že argument k asc metóda rozlišuje veľké a malé písmená a mala by sa zhodovať s metódou názov atribútu zoradiť podľa.

Objektové rozhranie Hibernate Criteria explicitne nastavuje smer poradia triedenia, čo sa odráža v príkaze SQL vygenerovanom kódom:

Hibernácia: vyberte this_.ID ako ID1_0_0_, this_.NAME ako NAME2_0_0_ z FOO this_ zoradiť podľa tohto_.ID sac

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

Zoradenie podľa viacerých atribútov vyžaduje iba pridanie znaku objednať namietať proti Kritériá príklad, ako v príklade nižšie:

Kritériá kritérií = sess.createCriteria (Foo.class, "FOO"); riteria.addOrder (Order.asc ("meno")); kritériá.addOrder (Order.asc ("id"));

Dotaz, ktorý sa generuje v SQL, je:

Hibernácia: vyberte this_.ID ako ID1_0_0_, this_.NAME ako NAME2_0_0_ z FOO this_ zoradiť podľa this_.NAME vzostupne, this_.ID vak

3.3. Nastavenie priority triedenia nulových hodnôt

Predvolene, keď má atribút na zoradenie nulový hodnôt, je na RDMS, aby rozhodol o prednosti. Hibernate Criteria Object API uľahčuje zmenu predvoleného a na konci umiestnite nuly vzostupne zoradeného zoznamu:

Kritériá kritérií = sess.createCriteria (Foo.class, "FOO"); riteria.addOrder (Order.asc ("meno"). nulls (NullPrecedence.LAST));

Tu je základ SQL dopyt - s je null potom 1 iné 0 doložka:

Hibernácia: vyberte this_.ID ako ID1_1_1_, this_.NAME ako NAME2_1_1_, this_.BAR_ID ako BAR_ID3_1_1_, this_.idx ako idx4_1_1_, bar2_.ID ako ID1_0_0_, bar2_.NAME ako NAME2_0_0_ z objednávky FOO, pokiaľ je toto_.NAME 1 else 0 end, this_.NAME asc

Prípadne môžeme tiež na začiatok umiestnite nuly zostupne zoradeného zoznamu:

Kritériá kritérií = sess.createCriteria (Foo.class, "FOO"); riteria.addOrder (Order.desc ("meno"). nulls (NullPrecedence.FIRST));

Nasleduje zodpovedajúci dotaz SQL - s je null potom 0 inak 1 doložka:

Hibernácia: vyberte this_.ID ako ID1_1_1_, this_.NAME ako NAME2_1_1_, this_.BAR_ID ako BAR_ID3_1_1_, this_.idx ako idx4_1_1_, bar2_.ID ako ID1_0_0_, bar2_.NAME ako NAME2_0_0_ z objednávky FOO, pokiaľ je toto_.NAME 0 inak 1 koniec, toto_.NAME desc

Poznač si to, ak je atribút na zoradenie primitívny typ ako int, a Výnimka prítomnosti bude hodený.

Napríklad ak je hodnota f.anIntVariable je null, potom je vykonanie dotazu:

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

bude hádzať:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Vlastnosti nastavovača primitívneho typu com.cc.jpa.example.Foo.anIntVariable bola priradená nulová hodnota.

4. Záver

Tento článok skúma triedenie pomocou režimu dlhodobého spánku - využitie dostupných rozhraní API pre jednoduché entity, ako aj pre entity vo vzťahu jedna k mnohým.

Implementáciu tohto Hibernate Sorting Tutorial nájdete v projekte github - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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