Sortiranje s JPA

1. Pregled

Ovaj članak ilustrira različite načine JPA se može koristiti za sortiranje.

2. Sortiranje pomoću JPA / JQL API-ja

Korištenje JQL za sortiranje vrši se uz pomoć Naruči po klauzula:

Niz jql; Upit upita = entityManager.createQuery (jql);

Na temelju ovog upita, JPA izravno izrađuje sljedeće SQL izraz:

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.name kao name2_4_ iz Foo foo0_ poredak po foo0_.id

Imajte na umu da SQL ključne riječi u JQL nizu ne razlikuju velika i mala slova, ali imena entiteta i njihovi atributi jesu.

2.1. Postavljanje redoslijeda sortiranja

Prema zadanim postavkama redoslijed sortiranja je uzlazan, ali se može izričito postaviti u JQL niz. Baš kao i u čistom SQL-u, mogućnosti naručivanja su uzlazno i desc:

Niz jql = "Odaberite f iz Foo-a kao redoslijed f po f.id desc"; Upit sortQuery = entityManager.createQuery (jql);

The generirani SQL upit tada će uključiti smjer narudžbe:

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.name kao name2_4_ iz Foo foo0_ poredak prema foo0_.id desc

2.2. Razvrstavanje po više atributa

Da bi se sortirali po više atributa, oni se dodaju u ovoziti po klauzula JQL niza:

Niz jql; Upit sortQuery = entityManager.createQuery (jql);

Oba uvjeta sortiranja pojavit će se u generirani SQL upit izjava:

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.name kao name2_4_ iz Foo foo0_ poredak prema foo0_.name asc, foo0_.id desc

2.3. Postavljanje prioriteta sortiranja null vrijednosti

Zadani prioritet nuli specifičan je za bazu podataka, ali to je moguće prilagoditi pomoću PRVI NULI ili POSLJEDNJE NULE klauzula u nizu upita HQL.

Evo jednostavnog primjera - naručivanje po Ime od Foo silaznim redoslijedom i postavljanjem Nulas na kraju:

Upit sortQuery = entityManager.createQuery ("Odaberite f iz Foo-a kao f poredak prema f.name desc NULLS LAST");

SQL upit koji se generira uključuje je nula klauzula 1 else 0 end (3. redak):

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.BAR_ID kao BAR_ID2_4_, foo0_.bar_Id kao bar_Id2_4_, foo0_.name kao name3_4_, iz Foo foo0_ poredak za slučaj kada je foo0_.name nula, a zatim 1 drugo 0 ime, kraj, foo0

2.4. Razvrstavanje jednog prema mnogim odnosima

Krećući se od osnovnih primjera, pogledajmo sada slučaj upotrebe sortiranje entiteta u relaciji jedan prema mnogimaBar koja sadrži zbirku Foo entiteta.

Želimo sortirati Bar entiteta, a također i njihova zbirka Foo entiteta - JPA je posebno jednostavan za ovaj zadatak:

  1. Sortiranje zbirke: dodajte Naruči napomena koja prethodi Foo zbirka u Bar entitet:
    @OrderBy ("name ASC") Popis fooList;
  2. Sortiranje entiteta koji sadrži zbirku:
    Niz jql = "Odaberite b iz trake kao b poredak po b.id"; Upit barQuery = entityManager.createQuery (jql); Popis barList = barQuery.getResultList ();

Imajte na umu da @NaručiBy napomena nije obavezna, ali u ovom je slučaju koristimo jer želimo sortirati Foo zbirka svake Bar.

Pogledajmo SQL upit poslano RDMS-u:

Hibernate: hibernacija: odaberite bar0_.id kao id1_0_, bar0_.name kao name2_0_ iz Bara bar0_ poredak po bar0_.id Hibernate: odaberite budist0_.BAR_ID kao BAR_ID2_0_0_, budist0_.id kao id1_4_0_, budist0_.id kao id1_4_1_, budistID_0_.B_1 ,_ID_0_.B_1 .bar_Id kao bar_Id2_4_1_, crazyist0_.name kao name3_4_1_ od Foo-a budist0_ gdje je crazyist0_.BAR_ID =? poredak prema budist0_.ime uzlazno 

Prvi upit sortira roditelja Bar entitet. Generira se drugi upit za sortiranje zbirke podređenih Foo entiteti koji pripadaju Bar.

3. Sortiranje s API-jem upita za kriterije JPA

S kriterijima JPA - narudžbaBy metoda je "sve na jednom mjestu" alternativa za postavljanje svih parametara sortiranja: i smjer narudžbe i atributi za razvrstavanje by može se postaviti. Slijedi API metode:

  • narudžbaBy(CriteriaBuilder.asc): Razvrstavanje u uzlaznom redoslijedu.
  • narudžbaBy(CriteriaBuilder.desc): Razvrstavanje u opadajućem redoslijedu.

Svaki Narudžba instanca se kreira s CriteriaBuilder objekt kroz svoj uzlazno ili desc metode.

Evo kratkog primjera - sortiranje Foos po njihovim Ime:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Korijen iz = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (from); kriterijiQuery.orderBy (kriterijiBuilder.asc (from.get ("naziv")));

Argument get metoda razlikuje velika i mala slova, jer treba odgovarati imenu atributa.

Za razliku od jednostavnog JQL-a, JPA Criteria Query Object API forsira izričit smjer narudžbe u upitu. U zadnjem retku ovog isječka koda primijetite da criteriaBuilder objekt određuje redoslijed sortiranja koji će biti uzlazan pozivanjem svog uzlazno metoda.

Kada se izvrši gornji kod, JPA generira SQL upit prikazan u nastavku. JPA kriterij objekta generira SQL izraz s eksplicitnim uzlazno klauzula:

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.name kao name2_4_ iz Foo foo0_ poredak prema foo0_.name asc

3.1. Razvrstavanje po više atributa

Za sortiranje po više atributa jednostavno dodajte Narudžba primjer na narudžbaBy metoda za razvrstavanje svakog atributa.

Evo kratkog primjera - sortiranje po Ime i iskaznica, u uzlazno i desc red, odnosno:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Korijen iz = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (from); kriterijiQuery.orderBy (kriterijiBuilder.asc (from.get ("ime")), criteriaBuilder.desc (from.get ("id")));

Odgovarajući SQL upit prikazan je u nastavku:

Hibernate: odaberite foo0_.id kao id1_4_, foo0_.name kao name2_4_ iz Foo foo0_ poredak prema foo0_.name asc, foo0_.id desc

4. Zaključak

Ovaj članak istražuje alternative sortiranja u Java Persistent API-u, za jednostavne entitete, kao i za entitete u relaciji jedan-prema-mnogima. Ovi pristupi delegiraju teret rada na sortiranju na sloj baze podataka.

Provedbu ovog Vodiča za sortiranje JPA možete pronaći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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