Rendezés a JPA-val

1. Áttekintés

Ez a cikk szemlélteti a különféle módokat A JPA rendezésre használható.

2. Rendezés JPA / JQL API-val

A JQL rendezésére a Rendezés kikötés:

Karakterlánc jql; Lekérdezés = entitásManager.createQuery (jql);

Ezen lekérdezés alapján a JPA az alábbiakat generálja SQL utasítás:

Hibernálás: válassza a foo0_.id nevet id1_4_, a foo0_.name nevet pedig2_4_ a Foo foo0_ megrendeléséből a foo0_.id címre.

Ne feledje, hogy a JQL karaktersorozat SQL kulcsszavai nem különböztetik a kis- és nagybetűket, az entitások és attribútumaik viszont igen.

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

Alapértelmezés szerint a rendezési sorrend növekvő, de kifejezetten beállítható a JQL karakterláncban. Ugyanúgy, mint a tiszta SQL-ben, a rendelési opciók is asc és desc:

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

A generált SQL lekérdezés ezután tartalmazza a rendelés irányát:

Hibernálás: válassza a foo0_.id nevet id1_4_, a foo0_.name nevet name2_4_ a Foo foo0_ megrendeléséből a foo0_.id desc

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

Több attribútum szerinti rendezéshez ezeket hozzáadjuk az o-hozrder által a JQL karaktersorozat záradéka:

Karakterlánc jql; Query sortQuery = entitásManager.createQuery (jql);

Mindkét rendezési feltétel megjelenik a generált SQL lekérdezés nyilatkozat:

Hibernálás: válassza a foo0_.id nevet id1_4_, a foo0_.name nevet2_4_ a Foo foo0_ sorrendből, foo0_.name asc, foo0_.id desc

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

A nullák alapértelmezett elsőbbsége adatbázis-specifikus, de ez a NULLS ELSŐ vagy NULLS UTOLSÓ záradék a HQL lekérdezési karakterláncban.

Itt van egy egyszerű példa - megrendelés név nak,-nek Foo csökkenő sorrendben és elhelyezésben Nullas a végén:

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

A létrehozott SQL lekérdezés tartalmazza a null az 1 else 0 végződés (3. sor):

Hibernálás: válassza a foo0_.id azonosítót id1_4_, foo0_.BAR_ID mint BAR_ID2_4_, foo0_.bar_Id mint bar_Id2_4_, foo0_.name név3_4_, a Foo foo0_ sorrendről esetre, amikor a foo0_.név null, akkor 1 másik 0 end desc00

2.4. Egy-sok kapcsolat rendezése

Az alapvető példákon túlhaladva nézzünk meg egy felhasználási esetet az entitások rendezése egy a sokhoz viszonybanRúd gyűjteményét tartalmazó Foo entitások.

Rendezni akarjuk a Rúd szervezetek és azok gyűjtése Foo entitások - a JPA különösen egyszerű erre a feladatra:

  1. A gyűjtemény rendezése: Adjon hozzá egy Rendezés előtti annotáció Foo gyűjtemény a Rúd entitás:
    @OrderBy ("név ASC") lista fooList;
  2. A gyűjteményt tartalmazó entitás rendezése:
    String jql = "Válassza ki a b elemet a sávból, mint b sorrendet a b.id alapján"; Query barQuery = entitásManager.createQuery (jql); List barList = barQuery.getResultList ();

Vegye figyelembe, hogy a @Rendezés a kommentár nem kötelező, de ebben az esetben azért használjuk, mert rendezni akarjuk a Foo mindegyik gyűjteménye Rúd.

Vessünk egy pillantást a SQL lekérdezés elküldve az RDMS-nek:

Hibernálás: válassza a bar0_.id mint id1_0_, a bar0_.name nevet2_0_ a bar bar0_ sorrendből a bar0_.id segítségével Hibernálás: válassza a foolist0_.BAR_ID-t BAR_ID2_0_0_, foolist0_.id mint id1_4_0_, foolist0_.ID mint id1_4___1_, .bar_Id mint bar_Id2_4_1_, foolist0_.name névként3_4_1_ a Foo foolist0_-ból, ahol foolist0_.BAR_ID =? sorrend szerint foolist0_.name asc 

Az első lekérdezés rendezi a szülőt Rúd entitás. A második lekérdezést a gyermek gyűjtemény rendezéséhez generálják Foo tartozó szervezetek Rúd.

3. Rendezés a JPA Criteria Query Object API-val

A JPA kritériumaival - a Rendezés A módszer egyablakos alternatíva az összes rendezési paraméter beállításához: mind a rend iránya és a rendezni kívánt attribútumok által beállítható. A módszer API-ja a következő:

  • Rendezés(CriteriaBuilder.asc): Növekvő sorrendben rendezi.
  • Rendezés(CriteriaBuilder.desc): Csökkenő sorrendben rendezi.

Minden egyes Rendelés példány a C-vel jön létreriteriaBuilder objektum azon keresztül asc vagy desc mód.

Itt van egy gyors példa - válogatás Foos általuk név:

CriteriaQuery criterionQuery = criterBuilder.createQuery (Foo.class); Gyökér a = feltételekQuery.from (Foo.class); CriteriaQuery select = feltételekQuery.select (from); feltételekQuery.orderBy (feltételekBuilder.asc (from.get ("név")));

Az érv a geA t módszer megkülönbözteti a kis- és nagybetűket, mivel meg kell egyeznie az attribútum nevével.

Az egyszerű JQL-vel szemben a JPA Criteria Query Object API kifejezett rend irányt erőltet a lekérdezésben. A kódrészlet utolsó sorában vegye figyelembe, hogy a szempontokBuilder Az objektum megadja a növekvő rendezési sorrendet annak meghívásával asc módszer.

A fenti kód végrehajtásakor a JPA létrehozza az alább látható SQL lekérdezést. A JPA Criteria Object egy SQL utasítást generál explicit módon asc kikötés:

Hibernálás: válassza a foo0_.id nevet id1_4_, a foo0_.name nevet name2_4_ a Foo foo0_ sorrendből, foo0_.name asc

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

Ha egynél több attribútum szerint szeretne rendezni, akkor egyszerűen adjon át egy Rendelés például a Rendezés módszer az egyes attribútumok szerint rendezésre.

Itt egy gyors példa - rendezés név és id, ban ben asc és desc sorrend:

CriteriaQuery criterionQuery = criterBuilder.createQuery (Foo.class); Gyökér a = feltételekQuery.from (Foo.class); CriteriaQuery select = feltételekQuery.select (from); feltételekQuery.orderBy (feltételekBuilder.asc (from.get ("név")), feltételekBuilder.desc (from.get ("id")));

A megfelelő SQL lekérdezés az alábbiakban látható:

Hibernálás: válassza a foo0_.id nevet id1_4_, a foo0_.name nevet2_4_ a Foo foo0_ sorrendből, foo0_.name asc, foo0_.id desc

4. Következtetés

Ez a cikk a Java Persistence API rendezési alternatíváit tárja fel, egyszerű entitások, valamint egyek a többiekkel kapcsolatban. Ezek a megközelítések átruházzák a rendezési munka terheit az adatbázis rétegre.

Ennek a JPA válogató oktatóanyagnak a megvalósítása megtalálható a GitHub projektben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.


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