Sortering med dvalemodus

1. Oversikt

Denne artikkelen illustrerer hvordan du sorterer med dvalemodus, ved å bruke både Hibernate Query Language (HQL) og Criteria API.

2. Sortering med HQL

Sortering med Hibernates HQL er så enkelt som å legge til Rekkefølge etter klausul til HQL-spørringsstrengen:

Streng hql = "FRA Foo f BESTILLING AV f.name"; Spørringsspørsmål = sess.createQuery (hql);

Etter at denne koden er utført, vil dvalemodus generere følgende SQL-spørring:

Dvalemodus: velg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rekkefølge etter foo0_.NAME

Standard retningsretningsretning er stigende. Dette er grunnen til at ordrebetingelsen, asc, er ikke inkludert i den genererte SQL-spørringen.

2.1. Bruke en eksplisitt sorteringsrekkefølge

For å spesifisere sorteringsrekkefølgen manuelt - må du inkludere bestillingsretningen i HQL spørringsstreng:

Streng hql = "FRA Foo f BESTILLING AV f.name ASC"; Spørringsspørsmål = sess.createQuery (hql);

I dette eksemplet angir du asc klausul i HQL ble inkludert i den genererte SQL-spørringen:

Dvalemodus: velg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rekkefølge av foo0_.NAME ASC

2.2. Sortering etter mer enn ett attributt

Flere attributter, sammen med en valgfri sorteringsrekkefølge, kan legges til Rekkefølge etter klausul i HQL-spørringsstrengen:

Streng hql = "FRA Foo f BESTILLING AV f.navn DESC, f.id ASC"; Spørringsspørsmål = sess.createQuery (hql);

Den genererte SQL-spørringen vil endres tilsvarende:

Dvalemodus: velg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rekkefølge etter foo0_.NAME DESC, foo0_.ID ASC

2.3. Angi sorteringsprioritet for nullverdier

Som standard når attributtet som skal sorteres etter har null verdier, er det opp til RDMS å bestemme forrang. Denne standardbehandlingen kan overstyres ved å plassere en NULLS FØRST eller NULLS SISTE klausul i HQL-spørringsstrengen.

Dette enkle eksemplet plasserer null på slutten av resultatlisten:

String hql = "FRA Foo f BESTILLING AV f.name NULLS SISTE"; Spørringsspørsmål = sess.createQuery (hql);

La oss se er null og deretter 1 annet 0 klausul i genererte SQL-spørring:

Dvalemodus: velg foo0_.ID som ID1_1_, foo0_.NAME som NAME2_1_, foo0_.BAR_ID som BAR_ID3_1_, foo0_.idx som idx4_1_ fra FOO foo0_ rekkefølge etter tilfelle når foo0_.NAME er null og deretter 1 annen 0 slutt, foo0_.NAME

2.4. Sorterer en til mange relasjoner

Lar oss analysere en kompleks sorteringssak: sorteringsenheter i forholdet en til mangeBar inneholder en samling av Foo enheter.

Vi gjør dette ved å kommentere samlingen med dvalemodus @Rekkefølge etter kommentar; vi vil spesifisere feltet bestillingen gjøres med, samt retningen:

@OrderBy (clause = "NAME DESC") Sett fooList = ny HashSet ();

Legg merke til det klausul argument til merknaden. Dette er unikt for dvalemodus @Rekkefølge etter, sammenlignet med lignende @Rekkefølge etter JPA-kommentar. En annen egenskap som skiller denne tilnærmingen fra JPA-ekvivalenten er at klausul argumentet indikerer at sorteringen gjøres basert på NAVN kolonnen i FOO bord, ikke på Navn attributt av Foo.

La oss nå se på den faktiske sorteringen av Barer og Foos:

Streng hql = "FRA Bar b BESTILLE AV b.id"; Spørringsspørsmål = sess.createQuery (hql);

De resulterende SQL-setning viser at den sorterte Foo's er plassert i en fooList:

Dvalemodus: velg bar0_.ID som ID1_0_, bar0_.NAME som NAME2_0_ fra BAR bar0_ rekkefølge etter bar0_.ID Dvalemodus: velg narrist0_.BAR_ID som BAR_ID3_0_0_, narrist0_.ID som ID1_1_0_, narrist0_.ID som id1_1_1_, ID .BAR_ID som BAR_ID3_1_1_, foolist0_.idx som idx4_1_1_ fra FOO foolist0_ hvor foolist0_.BAR_ID =? rekkefølge etter narrist0_.NAME beskriv

En ting å huske på er at det er det ikke mulig å sortere lister som det var tilfellet med JPA. Dvale-dokumentasjon sier:

“Dvalemodus ignorerer for øyeblikket @OrderBy på @ElementCollection på f.eks. Liste. Rekkefølgen av elementene er som returnert av databasen, udefinert. ”

Som en sidemerknad vil det være mulig å omgå denne begrensningen ved å bruke eldre XML-konfigurasjon for dvalemodus og erstatte element med en element.

3. Sortering etter dvalemodekriterier

Criteria Object API gir Rekkefølge klasse som hoved-API for å administrere sortering.

3.1. Angi sorteringsrekkefølgen

De Rekkefølge klasse har to metoder for å angi sorteringsrekkefølgen:

  • asc(Strengattributt) : Sorterer spørringen etter Egenskap i stigende rekkefølge.
  • avd(Strengattributt) : Sorterer spørringen etter Egenskap i fallende rekkefølge.

La oss starte med et enkelt eksempel - sortering etter en enkelt id Egenskap:

Kriteriekriterier = sess.createCriteria (Foo.class, "FOO"); criteria.addOrder (Order.asc ("id"));

Merk at argumentet til asc metoden er mellom store og små bokstaver og skal samsvare med Navn av attributtet å sortere etter.

Hibernate Criteria's Object API angir eksplisitt en sorteringsrekkefølge, og dette gjenspeiles i SQL-setningen generert av koden:

Dvalemodus: velg denne_ID som ID1_0_0_, denne_.NAVN som NAVN2_0_0_ fra FOO denne_bestillingen av denne_.ID-sekken

3.2. Sortering etter mer enn ett attributt

Sortering etter flere attributter krever bare å legge til et Rekkefølge motsette seg Kriterier eksempel, som i eksemplet nedenfor:

Kriteriekriterier = sess.createCriteria (Foo.class, "FOO"); criteria.addOrder (Order.asc ("navn")); criteria.addOrder (Order.asc ("id"));

Spørringen som genereres i SQL er:

Dvalemodus: velg denne_.ID som ID1_0_0_, denne_.NAVN som NAME2_0_0_ fra FOO denne_ rekkefølgen av denne_.NAME asc, denne_.ID-sekken

3.3. Angi sorteringsprioritet for nullverdier

Som standard når attributtet som skal sorteres etter har null verdier, er det opp til RDMS å bestemme forrang. Hibernate Criteria Object API gjør det enkelt å endre standard og plasser null på slutten av en stigende bestilt liste:

Kriteriekriterier = sess.createCriteria (Foo.class, "FOO"); criteria.addOrder (Order.asc ("name"). nulls (NullPrecedence.LAST));

Her er det underliggende SQL spørring - med er null og deretter 1 annet 0 klausul:

Dvalemodus: velg dette_ID som ID1_1_1_, dette_NAVN som NAME2_1_1_, dette_.BAR_ID som BAR_ID3_1_1_, dette_.idx som idx4_1_1_, bar2_.ID som ID1_0_0_, bar2_.NAME som NAME2_0_0_ fra FOO-rekkefølge etter tilfelle når dette er null. 1 annen 0 slutt, denne_.NAME stig

Alternativt kan vi også plasser nullene i begynnelsen av en synkende ordnet liste:

Kriteriekriterier = sess.createCriteria (Foo.class, "FOO"); criteria.addOrder (Order.desc ("name"). nulls (NullPrecedence.FIRST));

Den tilsvarende SQL-spørringen følger - med er null da 0 annet 1 klausul:

Dvalemodus: velg dette_ID som ID1_1_1_, dette_NAVN som NAME2_1_1_, dette_.BAR_ID som BAR_ID3_1_1_, dette_.idx som idx4_1_1_, bar2_.ID som ID1_0_0_, bar2_.NAME som NAME2_0_0_ fra FOO-rekkefølge etter tilfelle når dette er null. 0 andre 1 ende, denne_.NAME besk

Noter det, hvis attributtet å sortere etter er en primitiv type som en int, en PresisitenceException vil kastes.

For eksempel hvis verdien av f.anIntVariable er null, så er kjøringen av spørringen:

String jql = "Velg f fra Foo som f rekkefølge etter f.anIntVariable desc NULLS FIRST"; Query sortQuery = entityManager.createQuery (jql);

vil kaste:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Nullverdi ble tildelt en egenskap med primitiv type setter av com.cc.jpa.example.Foo.anIntVariable

4. Konklusjon

Denne artikkelen utforsker sortering med dvalemodus - ved hjelp av tilgjengelige API-er for enkle enheter så vel som for enheter i en-til-mange-relasjon.

Implementeringen av denne Hibernate Sorting Tutorial finner du i github-prosjektet - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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