Sortering med JPA
1. Oversikt
Denne artikkelen illustrerer de forskjellige måtene JPA kan brukes til sortering.
2. Sortering med JPA / JQL API
Å bruke JQL til å sortere gjøres ved hjelp av Rekkefølge etter klausul:
String jql; Query query = entityManager.createQuery (jql);
Basert på dette spørsmålet genererer JPA følgende rett frem SQL-setning:
Dvalemodus: velg foo0_.id som id1_4_, foo0_.name som navn2_4_ fra Foo foo0_ rekkefølge etter foo0_.id
Merk at SQL-nøkkelordene i JQL-strengen ikke er store og små bokstaver, men navnene på enhetene og attributtene er.
2.1. Angi sorteringsrekkefølgen
Som standard sorteringsrekkefølgen er stigende, men det kan eksplisitt settes i JQL-strengen. Akkurat som i ren SQL er bestillingsalternativene asc og avd:
String jql = "Velg f fra Foo som f rekkefølge etter f.id desc"; Query sortQuery = entityManager.createQuery (jql);
De genererte SQL-spørring vil da inkludere bestillingsretningen:
Dvalemodus: velg foo0_.id som id1_4_, foo0_.name som navn2_4_ fra Foo foo0_ rekkefølge etter foo0_.id desc
2.2. Sortering etter mer enn ett attributt
For å sortere etter flere attributter, blir disse lagt til order av klausul om JQL-strengen:
String jql; Query sortQuery = entityManager.createQuery (jql);
Begge sorteringsforholdene vises i genererte SQL-spørring uttalelse:
Dvalemodus: velg foo0_.id som id1_4_, foo0_.name som navn2_4_ fra Foo foo0_ rekkefølge etter foo0_.name asc, foo0_.id desc
2.3. Angi sorteringsprioritet for nullverdier
Standard prioritet for null er databasespesifikk, men dette kan tilpasses gjennom NULLS FØRST eller NULLS SISTE klausul i HQL-spørringsstrengen.
Her er et enkelt eksempel - bestille etter Navn av Foo i fallende rekkefølge og plassering Nulls på slutten:
Query sortQuery = entityManager.createQuery ("Velg f fra Foo som f rekkefølge etter f.name desc NULLS SISTE");
SQL-spørringen som genereres inkluderer er null 1 andre 0 sluttklausul (3. linje):
Dvalemodus: velg foo0_.id som id1_4_, foo0_.BAR_ID som BAR_ID2_4_, foo0_.bar_Id som bar_Id2_4_, foo0_.name som navn3_4_, fra Foo foo0_ rekkefølge etter tilfelle når foo0_.name er null og deretter 1 annet 0 end, foo
2.4. Sorterer en til mange relasjoner
La oss nå se på en brukssak som involverer sorteringsenheter i forholdet en til mange – Bar inneholder en samling av Foo enheter.
Vi vil sortere Bar enheter og også deres samling av Foo enheter - JPA er spesielt enkelt for denne oppgaven:
- Sortering av samlingen: Legg til en Rekkefølge etter kommentar før Foo samling i Bar enhet:
@OrderBy ("navn ASC") Liste fooList;
- Sortering av enheten som inneholder samlingen:
String jql = "Velg b fra Bar som b rekkefølge etter b.id"; Query barQuery = entityManager.createQuery (jql); Liste barList = barQuery.getResultList ();
Merk at @Rekkefølge etter merknader er valgfritt, men vi bruker det i dette tilfellet fordi vi vil sortere Foo samling av hver Bar.
La oss ta en titt på SQL-spørring sendt til RDMS:
Dvalemodus: velg bar0_.id som id1_0_, bar0_.name som navn2_0_ fra Bar bar0_ rekkefølge etter bar0_.id Dvalemodus: velg foolist0_.BAR_ID som BAR_ID2_0_0_, foolist0_id som id1_4_0_, narrist0_.id som id1_4____ID_AR_ID_AR_ID .bar_Id som bar_Id2_4_1_, foolist0_.name som navn3_4_1_ fra Foo foolist0_ hvor foolist0_.BAR_ID =? rekkefølge etter foolist0_.name asc
Den første spørringen sorterer foreldrene Bar enhet. Den andre spørringen genereres for å sortere samlingen av barn Foo enheter som tilhører Bar.
3. Sortering med JPA Criteria Query Object API
Med JPA-kriterier - rekkefølge etter metoden er et "one-stop" alternativ for å sette alle sorteringsparametere: både bestill retning og attributter å sortere kan settes inn. Følgende er metodens API:
- rekkefølge etter(CriteriaBuilder.asc): Sorterer i stigende rekkefølge.
- rekkefølge etter(CriteriaBuilder.desc): Sorterer i fallende rekkefølge.
Hver Rekkefølge forekomst er opprettet med CriteriaBuilder objekt gjennom sin asc eller avd metoder.
Her er et raskt eksempel - sortering Foos av deres Navn:
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Rot fra = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (fra); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("navn")));
Argumentet til get-metoden er mellom store og små bokstaver, siden den må samsvare med navnet på attributtet.
I motsetning til enkel JQL, JPA Criteria Query Object API tvinger en eksplisitt ordreretning i spørringen. Legg merke til i den siste linjen i denne kodebiten at criteriaBuilder objektet angir sorteringsrekkefølgen som skal stige ved å ringe til den asc metode.
Når koden ovenfor kjøres, genererer JPA SQL-spørringen vist nedenfor. JPA Criteria Object genererer en SQL-setning med en eksplisitt asc klausul:
Dvalemodus: velg foo0_.id som id1_4_, foo0_.name som name2_4_ fra Foo foo0_ rekkefølge etter foo0_.name asc
3.1. Sortering etter mer enn ett attributt
For å sortere etter mer enn ett attributt passerer du bare en Rekkefølge eksempel til rekkefølge etter metode for hvert attributt å sortere etter.
Her er et raskt eksempel - sortering etter Navn og id, i asc og avd rekkefølge, henholdsvis:
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Rot fra = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (fra); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("name")), criteriaBuilder.desc (from.get ("id")));
Den tilsvarende SQL-spørringen er vist nedenfor:
Dvalemodus: velg foo0_.id som id1_4_, foo0_.name som navn2_4_ fra Foo foo0_ rekkefølge etter foo0_.name asc, foo0_.id desc
4. Konklusjon
Denne artikkelen utforsker sorteringsalternativene i Java Persistence API, for enkle enheter så vel som for enheter i en-til-mange-relasjon. Disse tilnærmingene delegerer byrden ved sorteringsarbeidet til databaselaget.
Implementeringen av denne JPA-sorteringsveiledningen finner du i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.