Válogatás hibernált állapotban

1. Áttekintés

Ez a cikk szemlélteti hogyan válogassunk hibernált állapotban, mind a Hibernate Query Language (HQL), mind a Criteria API használatával.

2. Rendezés HQL-vel

A Hibernate HQL-vel való válogatás ugyanolyan egyszerű, mint a Rendezés záradék a HQL lekérdezési karakterlánchoz:

Karakterlánc hql = "FOO-tól F ORDER BY f.name"; Lekérdezés = sess.createQuery (hql);

A kód végrehajtása után a hibernálás a következő SQL lekérdezést generálja:

Hibernálás: válassza a foo0_.ID azonosítót ID1_0_, a foo0_.NAME nevet pedig NAME2_0_ a FOO foo0_ megrendelésétől foo0_.NAME

Az alapértelmezett rendezési sorrend növekvő. Ezért a megrendelés feltétele, asc, nem szerepel a létrehozott SQL lekérdezésben.

2.1. Kifejezett rendezési sorrend használata

A rendezési sorrend manuális megadása - be kell foglalnia a sorrend irányát a HQL lekérdezési karakterlánc:

Karakterlánc hql = "FOO-tól F ORDER BY f.name ASC"; Lekérdezés = sess.createQuery (hql);

Ebben a példában a asc a generált SQL lekérdezés tartalmazta a HQL záradékát:

Hibernálás: válassza a foo0_.ID azonosítót ID1_0_, foo0_.NAME mint NAME2_0_ a FOO foo0_ megrendelésből, foo0_.NAME ASC

2.2. Rendezés több mint egy tulajdonság szerint

Több attribútum, egy opcionális rendezési sorrenddel együtt hozzáadható a Rendezés záradék a HQL lekérdezési karakterláncban:

Karakterlánc hql = "FOO-tól F ORDER BY f.name DESC, f.id ASC"; Lekérdezés = sess.createQuery (hql);

A létrehozott SQL lekérdezés ennek megfelelően változik:

Hibernálás: válassza a foo0_.ID azonosítót ID1_0_, foo0_.NAME mint NAME2_0_ a FOO foo0_ megrendelésből, foo0_.NAME DESC, foo0_.ID ASC

2.3. A null értékek rendezési elsőbbségének beállítása

Alapértelmezés szerint, ha a rendezni kívánt attribútum rendelkezik nulla értékeket, az RDMS-nek kell döntenie az elsőbbségről. Ez az alapértelmezett kezelés felülírható az elhelyezéssel a NULLS ELSŐ vagy NULLS UTOLSÓ záradék a HQL lekérdezési karakterláncban.

Ez az egyszerű példa minden nullát az eredménylista végére helyez:

Karakterlánc hql = "FOO-tól F ORDER BY f.name NULLS LAST"; Lekérdezés = sess.createQuery (hql);

Lássuk a null, akkor 1 másik 0 záradék a generált SQL lekérdezés:

Hibernálás: válassza a foo0_.ID azonosítót ID1_1_, foo0_.NAME mint NAME2_1_, foo0_.BAR_ID mint BAR_ID3_1_, foo0_.idx mint idx4_1_ a FOO foo0_ menüből, ha foo0_.NAME értéke null, akkor 1 másik 0 vége, foo0_.NAME

2.4. Egy-sok kapcsolat rendezése

Elemezhetünk egy összetett rendezési esetet: az entitások rendezése egy a sokhoz viszonybanRúd gyűjteményét tartalmazó Foo entitások.

Ezt úgy tesszük meg, hogy annotáljuk a gyűjteményt a hibernált @Rendezés annotáció; megadjuk a mezőt, amelyen a rendelés történik, valamint az irányt:

@OrderBy (clause = "NAME DESC") Állítsa be a fooList = new HashSet () parancsot;

Figyelje meg kikötés érv az annotációhoz. Ez egyedülálló a Hibernate-ékénél @Rendezés, összehasonlítva a hasonlóval @Rendezés JPA kommentár. Egy másik jellemző, amely megkülönbözteti ezt a megközelítést a közös parlamenti közgyűlés megfelelőjétől, az, hogy kikötés argumentum azt jelzi, hogy a rendezés a NÉV oszlop FOO asztalon, nem a név attribútuma Foo.

Most nézzük meg a tényleges válogatást Bárok és Foos:

Karakterlánc hql = "F b sávból ORDER BY b.id"; Lekérdezés = sess.createQuery (hql);

A eredmény SQL utasítás azt mutatja, hogy a rendezett Foo's kerülnek a fooList:

Hibernálás: válassza a bar0_.ID azonosítót ID1_0_, a bar0_.NAME nevet pedig NAME2_0_ a BAR-ból bar0_ a bar0_ sorrendben. ID Hibernálás: válassza a foolist0_.BAR_ID-t BAR_ID3_0_0_, foolist0_.ID-t ID1_1_0_, foolist0_.ID néven ID1_1_1__, .BAR_ID mint BAR_ID3_1_1_, foolist0_.idx mint idx4_1_1_ a FOO foolist0_-ból, ahol foolist0_.BAR_ID =? rendelés: foolist0_.NAME desc

Egy dolgot szem előtt kell tartani, hogy van nem lehet listákat rendezni ahogy a JPA esetében is történt. A hibernált dokumentáció a következőket mondja ki:

„A hibernálás jelenleg figyelmen kívül hagyja az @OrderBy-t a @ElementCollection-on pl. Lista. Az elemek sorrendjét az adatbázis adja vissza, meghatározatlan. "

Mellékképpen meg lehetne oldani ezt a korlátozást a Hibernate régi XML-konfigurációjának használatával, és a elem egy elem.

3. Rendezés hibernált kritériumokkal

A Criteria Object API biztosítja a Rendelés osztály mint fő API a rendezés kezelésére.

3.1. A rendezési sorrend beállítása

A Rendelés osztály kétféle módszerrel állíthatja be a rendezési sorrendet:

  • asc(String attribútum) : Rendezi a lekérdezést tulajdonság növekvő sorrendben.
  • desc(String attribútum) : Rendezi a lekérdezést tulajdonság csökkenő sorrendben.

Kezdjük egy egyszerű példával - szétválogatás egyesével id tulajdonság:

Feltételek kritériumai = sess.createCriteria (Foo.class, "FOO"); feltételek.addOrder (Rendelés.asc ("id"));

Vegye figyelembe, hogy a asc A módszer megkülönbözteti a kis- és nagybetűket, és meg kell felelnie a név az attribútum szerint rendezni.

A Hibernate Criteria Object API kifejezetten meghatározza a rendezési sorrendet, és ez tükröződik a kód által generált SQL utasításban:

Hibernálás: válassza ezt a_azonosítót ID1_0_0_, a_nevet pedig NAME2_0_0_ néven a FOO-ból ezt a megrendelést ennek a_azonosítónak

3.2. Rendezés több mint egy tulajdonság szerint

A több attribútum szerinti rendezéshez csak egy hozzáadása szükséges Rendelés kifogásolja a Kritériumok például, mint az alábbi példában:

Feltételek kritériumai = sess.createCriteria (Foo.class, "FOO"); feltételek.addOrder (Rendelés.asc ("név")); feltételek.addOrder (Rendelés.asc ("id"));

Az SQL-ben előállított lekérdezés a következő:

Hibernálás: válassza ezt a_azonosítót ID1_0_0_, ezt a_NEVET NAME2_0_0_ néven a FOO-ból ezt a_rendelést ezen_.NAME asc, this_.ID zsák

3.3. A null értékek rendezési elsőbbségének beállítása

Alapértelmezés szerint, ha a rendezni kívánt attribútum rendelkezik nulla értékeket, az RDMS-nek kell döntenie az elsőbbségről. A Hibernate Criteria Object API megkönnyíti az alapértelmezett és tegyen nullákat a végére növekvő sorrendben:

Feltételek kritériumai = sess.createCriteria (Foo.class, "FOO"); feltételek.addOrder (Rendelés.asc ("név"). nulls (NullPrecedence.LAST));

Itt van a mögöttes SQL lekérdezés - a null, akkor 1 másik 0 kikötés:

Hibernálás: válassza ezt a_azonosítót ID1_1_1_-ként, ezt a_NEVET NAME2_1_1_-ként, ezt_BAR_ID-t BAR_ID3_1_1_-ként, ezt__idx-t ID4_1_1_-ként, bar2_.ID-t ID1_0_0_ néven, bar2_.NAME néven pedig NAME2_0_0_-ként a FOO-tól. 1 másik 0 vég, ez a_.NEV asc

Alternatív megoldásként azt is megtehetjük tegye a nullákat az elejére csökkenő sorrendben:

Feltételek kritériumai = sess.createCriteria (Foo.class, "FOO"); feltételek.addOrder (Order.desc ("név"). nulls (NullPrecedence.FIRST));

A megfelelő SQL lekérdezés következik - a null, akkor 0 mást 1 kikötés:

Hibernálás: válassza ezt a_azonosítót ID1_1_1_-ként, ezt a_NEVET NAME2_1_1_-ként, ezt_BAR_ID-t BAR_ID3_1_1_-ként, ezt__idx-t ID4_1_1_-ként, bar2_.ID-t ID1_0_0_ néven, bar2_.NAME néven pedig NAME2_0_0_-ként a FOO-tól. 0 másik 1 vég, ez a_NEV desc

Vegye figyelembe, hogy, ha a rendezni kívánt attribútum primitív típusú, mint egy int, a PresisitenceException eldobják.

Például, ha az értéke f.anIntVariable értéke null, akkor a lekérdezés végrehajtása:

String jql = "Válasszon f-et a Foo-ból, f sorrendben f.anIntVariable desc NULLS FIRST szerint" Query sortQuery = entitásManager.createQuery (jql);

dobni fog:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: A null értéket a com.cc.jpa.example.Foo.anIntVariable primitív típusú szetter tulajdonságához rendeltük.

4. Következtetés

Ez a cikk a Hibernate rendezését tárja fel - a rendelkezésre álló API-k használatával egyszerű entitásokhoz, valamint az egy az egyhez-sokhoz viszonyítva.

A Hibernate Sorting Tutorial megvalósítása megtalálható a github projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.