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 mangeBar 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:

  1. Sortering av samlingen: Legg til en Rekkefølge etter kommentar før Foo samling i Bar enhet:
    @OrderBy ("navn ASC") Liste fooList;
  2. 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.


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