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 mange – Bar 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.