Sortering med dvale

1. Oversigt

Denne artikel illustrerer hvordan man sorterer med dvale, ved hjælp af både Hibernate Query Language (HQL) og Criteria API.

2. Sortering med HQL

Sortering med Hibernates HQL er så simpelt som at tilføje Bestil efter klausul til HQL-forespørgselsstrengen:

Streng hql = "FRA Foo f BESTIL EFTER f.name"; Forespørgsel = sess.createQuery (hql);

Når denne kode er udført, genererer Hibernate følgende SQL-forespørgsel:

Dvaletilstand: vælg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rækkefølge efter foo0_.NAME

Standardsorteringsretningen er stigende. Dette er grunden til, at ordrebetingelsen, asc, er ikke inkluderet i den genererede SQL-forespørgsel.

2.1. Brug af en eksplicit sorteringsrækkefølge

For at specificere sorteringsrækkefølgen manuelt - skal du medtage ordreretningen i HQL forespørgselsstreng:

Streng hql = "FRA Foo f ORDRE AF f.name ASC"; Forespørgsel = sess.createQuery (hql);

I dette eksempel skal du indstille asc klausul i HQL blev inkluderet i den genererede SQL-forespørgsel:

Dvaletilstand: vælg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rækkefølge efter foo0_.NAME ASC

2.2. Sortering efter mere end en attribut

Flere attributter sammen med en valgfri sorteringsrækkefølge kan føjes til Bestil efter klausul i HQL-forespørgselsstrengen:

Streng hql = "FRA Foo f BESTILLING AF f.navn DESC, f.id ASC"; Forespørgsel = sess.createQuery (hql);

Den genererede SQL-forespørgsel ændres i overensstemmelse hermed:

Dvaletilstand: vælg foo0_.ID som ID1_0_, foo0_.NAME som NAME2_0_ fra FOO foo0_ rækkefølge efter foo0_.NAME DESC, foo0_.ID ASC

2.3. Indstilling af sorteringspræference for nulværdier

Som standard, når attributten, der skal sorteres efter, har nul værdier, er det op til RDMS at bestemme forrang. Denne standardbehandling kan tilsidesættes ved at placere -en NULLS FØRST eller NULLS SIDSTE klausul i HQL-forespørgselsstrengen.

Dette enkle eksempel placerer eventuelle nuller i slutningen af ​​resultatlisten:

String hql = "FRA Foo f ORDER BY f.name NULLS LAST"; Forespørgsel = sess.createQuery (hql);

Lad os se er nul, så 1 andet 0 klausul i genereret SQL-forespørgsel:

Dvaletilstand: vælg 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_ rækkefølge efter sag, når foo0_.NAME er nul, så ellers slutter 0, foo0_.NAME

2.4. Sorterer en til mange forhold

Lad os analysere en kompleks sorteringssag: sortering af enheder i forholdet en til mangeBar indeholdende en samling af Foo enheder.

Vi gør dette ved at kommentere samlingen med dvale @OrderBy kommentar; vi specificerer det felt, hvor bestillingen udføres, samt retningen:

@OrderBy (clause = "NAVN DESC") Indstil fooList = ny HashSet ();

Læg mærke til det klausul argument til kommentaren. Dette er unikt for dvale @OrderBy, sammenlignet med lignende @OrderBy JPA-kommentar. Et andet kendetegn, der adskiller denne tilgang fra dens JPA-ækvivalent, er, at klausul argument angiver, at sorteringen foretages på baggrund af NAVN kolonne i FOO bord, ikke på navn attribut for Foo.

Lad os nu se på den faktiske sortering af Barer og Foos:

Streng hql = "FRA bjælke B BESTIL EFTER b.id"; Forespørgsel = sess.createQuery (hql);

Det resulterende SQL-sætning viser, at den sorterede Foo's placeres i en fooList:

Dvaletilstand: vælg bar0_.ID som ID1_0_, bar0_.NAME som NAME2_0_ fra BAR bar0_ rækkefølge efter bar0_.ID Dvaletilstand: vælg foolist0_.BAR_ID som BAR_ID3_0_0_, foolist0_.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 =? rækkefølge efter foolist0_.NAME beskrivelse

En ting at huske på er, at det er ikke muligt at sortere lister som det var tilfældet med JPA. I dvale-dokumentation hedder det:

“Dvale ignorerer i øjeblikket @OrderBy på @ElementCollection på f.eks. Liste. Elementernes rækkefølge er som defineret af databasen udefineret. ”

Som en sidebemærkning er det muligt at omgå denne begrænsning ved at bruge ældre XML-konfiguration til dvale og erstatte element med en element.

3. Sortering efter dvale-kriterier

Criteria Object API leverer Bestille klasse som den vigtigste API til at styre sortering.

3.1. Indstilling af sorteringsrækkefølgen

Det Bestille klasse har to metoder til at indstille sorteringsrækkefølgen:

  • asc(Strengattribut) : Sorterer forespørgslen efter attribut i stigende rækkefølge.
  • beskrivelse(Strengattribut) : Sorterer forespørgslen efter attribut i faldende rækkefølge.

Lad os starte med et simpelt eksempel - sortering efter en enkelt id attribut:

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

Bemærk, at argumentet til asc metoden er store og små bogstaver og skal matche navn af attributten, der skal sorteres efter.

Hibernate Criteria's Object API indstiller eksplicit en sorteringsrækkefølge, og dette afspejles i SQL-sætningen genereret af koden:

Dvaletilstand: vælg dette_.ID som ID1_0_0_, dette_.NAME som NAME2_0_0_ fra FOO dette_ rækkefølge ved denne_.ID-sæk

3.2. Sortering efter mere end en attribut

Sortering efter flere attributter kræver kun tilføjelse af en Bestille modsætter sig Kriterier eksempel, som i eksemplet nedenfor:

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

Forespørgslen, der genereres i SQL, er:

Dvaletilstand: vælg denne_ID som ID1_0_0_, denne_.NAME som NAME2_0_0_ fra FOO denne_ rækkefølge af denne_.NAME asc, denne_.ID-sæk

3.3. Indstilling af sorteringspræference for nulværdier

Som standard, når attributten, der skal sorteres efter, har nul værdier, er det op til RDMS at bestemme forrang. Hibernate Criteria Object API gør det nemt at ændre denne standard og placer nuller i slutningen af en stigende ordnet liste:

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

Her er det underliggende SQL forespørgsel - med er nul, så 1 andet 0 klausul:

Dvaletilstand: vælg dette_.ID som ID1_1_1_, dette_.NAME 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-rækkefølge efter tilfældet, når dette er. 1 anden 0 slutter, denne_.NAME asc

Alternativt kan vi også placer nullerne i starten af en faldende ordnet liste:

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

Den tilsvarende SQL-forespørgsel følger - med er nul, så er 0 andet 1 klausul:

Dvaletilstand: vælg dette_.ID som ID1_1_1_, dette_.NAME 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-rækkefølge efter tilfældet, når dette er. 0 andet 1 ende, denne_.NAME besk

Noter det, hvis attributten, der skal sorteres efter, er en primitiv type som en int, -en PresisitenceException vil kastes.

For eksempel, hvis værdien af f.anIntVariable er nul, så er udførelsen af ​​forespørgslen:

String jql = "Vælg f fra Foo som f rækkefølge efter f.anIntVariable desc NULLS FIRST"; Forespørgsel sortQuery = entityManager.createQuery (jql);

vil kaste:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Null-værdi blev tildelt en egenskab af primitiv type setter af com.cc.jpa.example.Foo.anIntVariable

4. Konklusion

Denne artikel udforsker sortering med dvale - ved hjælp af de tilgængelige API'er til enkle enheder såvel som for enheder i en-til-mange-relation.

Implementeringen af ​​denne Hibernate Sorting Tutorial kan findes i github-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.