Razvrstavanje pomoću hibernacije

1. Pregled

Ovaj članak ilustrira kako sortirati s hibernacijom, koristeći i jezik hibernacije upita (HQL) i API kriterija.

2. Sortiranje s HQL-om

Razvrstavanje pomoću Hibernate-ovog HQL-a jednostavno je poput dodavanja Naruči po klauzula u HQL upitni niz:

Niz hql = "OD NALOGA ZA NARUČI po f.name"; Upit upita = sess.createQuery (hql);

Nakon izvršavanja ovog koda, Hibernate će generirati sljedeći SQL upit:

Hibernate: odaberite foo0_.ID kao ID1_0_, foo0_.NAME kao NAME2_0_ iz FOO foo0_ poredak po foo0_.NAME

Zadani smjer sortiranja je uzlazno. Zbog toga je uvjet narudžbe, uzlazno, nije uključen u generirani SQL upit.

2.1. Korištenje eksplicitnog naloga za sortiranje

Da biste ručno odredili redoslijed sortiranja - morat ćete uključiti smjer narudžbe u HQL niz upita:

Niz hql = "OD NALOGA ZA NARUČI f.name ASC"; Upit upita = sess.createQuery (hql);

U ovom primjeru, postavljanje uzlazno klauzula u HQL-u uključena je u generirani SQL upit:

Hibernate: odaberite foo0_.ID kao ID1_0_, foo0_.NAME kao NAME2_0_ iz FOO foo0_ poredak prema foo0_.NAME ASC

2.2. Razvrstavanje po više atributa

Višestruki atributi, zajedno s neobaveznim redoslijedom sortiranja, mogu se dodati u Naruči po klauzula u nizu upita HQL:

Niz hql = "OD NALOGA NARUČI po f.name DESC, f.id ASC"; Upit upita = sess.createQuery (hql);

Generirani SQL upit promijenit će se u skladu s tim:

Hibernate: odaberite foo0_.ID kao ID1_0_, foo0_.NAME kao NAME2_0_ iz FOO foo0_ poredak prema foo0_.NAME DESC, foo0_.ID ASC

2.3. Postavljanje prioriteta sortiranja null vrijednosti

Prema zadanim postavkama, kada atribut po kojem se sortira ima null vrijednosti, na RDMS-u je da odluči o prednosti. Ovaj zadani tretman može se nadjačati postavljanjem a PRVI NULI ili POSLJEDNJE NULE klauzula u nizu upita HQL.

Ovaj jednostavni primjer stavlja sve nule na kraj popisa rezultata:

Niz hql = "OD NAPRIJED NARUDŽBE PO f.name NULLS LAST"; Upit upita = sess.createQuery (hql);

Pogledajmo je null, a zatim 1 else 0 klauzula u generirani SQL upit:

Hibernate: odaberite foo0_.ID kao ID1_1_, foo0_.NAME kao NAME2_1_, foo0_.BAR_ID kao BAR_ID3_1_, foo0_.idx kao idx4_1_ iz FOO foo0_ poredak za slučaj kada je foo0_.NAME nula, a zatim 1 drugi 0 kraj, foo0_.NAME

2.4. Razvrstavanje jednog prema mnogim odnosima

Analizirajmo složeni slučaj sortiranja: sortiranje entiteta u relaciji jedan prema mnogimaBar koja sadrži zbirku Foo entiteta.

To ćemo učiniti označavanjem zbirke oznakom zimski san @Naruči bilješka; odredit ćemo polje po kojem se vrši narudžba, kao i smjer:

@OrderBy (klauzula = "NAME DESC") Postavi fooList = novi HashSet ();

Primijeti da klauzula argument uz napomenu. Ovo je jedinstveno za Hibernate @NaručiBy, u usporedbi sa sličnim @NaručiBy JPA bilješka. Sljedeća karakteristika koja razlikuje ovaj pristup od JPA ekvivalenta je ta klauzula argument ukazuje da se sortiranje vrši na temelju IME stupac FOO stol, a ne na Ime atribut Foo.

Pogledajmo sada stvarno sortiranje Barovi i Foos:

Niz hql = "OD trake b NARUČI po b.id"; Upit upita = sess.createQuery (hql);

The rezultirajući SQL izraz pokazuje da je sortirano Foo's smješteni su u a fooList:

Hibernate: hibernacija: odaberite bar0_.ID kao ID1_0_, bar0_.NAME kao NAME2_0_ iz BAR bar0_ poredak po bar0_.ID Hibernate: odaberite budist0_.BAR_ID kao BAR_ID3_0_0_, budist0_.ID kao ID1_1_0_, budist0_.ID kao ID1_1_1_, budist_0__1, ID kao ID1_1_1_, glupan_0 .BAR_ID kao BAR_ID3_1_1_, budist0_.idx kao idx4_1_1_ od FOO-a budist0_ gdje je budist0_.BAR_ID =? narudžba prema budist0_.NAME desc

Jedno treba imati na umu da je tako nije moguće sortirati popise kao što je bio slučaj sa JPA. Dokumentacija o hibernaciji navodi:

“Hibernate trenutno ignorira @OrderBy na @ElementCollection na npr. Popis. Redoslijed elemenata vraćen je bazom podataka, nedefiniran. "

Kao popratnu napomenu, bilo bi moguće zaobići ovo ograničenje upotrebom naslijeđene XML konfiguracije za hibernaciju i zamjenom element s a element.

3. Sortiranje s kriterijima hibernacije

API kriterija nudi Narudžba klasa kao glavni API za upravljanje razvrstavanjem.

3.1. Postavljanje redoslijeda sortiranja

The Narudžba klasa ima dvije metode za postavljanje redoslijeda sortiranja:

  • uzlazno(Atribut niza) : Sortira upit po atribut rastućim redoslijedom.
  • desc(Atribut niza) : Sortira upit po atribut silaznim redoslijedom.

Počnimo s jednostavnim primjerom - razvrstavanjem po jedinici iskaznica atribut:

Kriteriji kriterija = sess.createCriteria (Foo.class, "FOO"); kriteriji.addOrder (Order.asc ("id"));

Imajte na umu da je argument za uzlazno metoda razlikuje velika i mala slova i trebala bi odgovarati Ime atributa po kojem treba razvrstati.

Object API kriterija hibernacije izričito postavlja smjer redoslijeda sortiranja i to se odražava u SQL izrazu generiranom kodom:

Hibernate: odaberite this_.ID kao ID1_0_0_, this_.NAME kao NAME2_0_0_ iz FOO this_ redoslijeda po this_.ID sac

3.2. Razvrstavanje po više atributa

Za sortiranje po više atributa potrebno je dodati samo Narudžba prigovoriti na Kriteriji primjerku, kao u primjeru u nastavku:

Kriteriji kriterija = sess.createCriteria (Foo.class, "FOO"); kriteriji.addOrder (Order.asc ("ime")); kriteriji.addOrder (Order.asc ("id"));

Upit koji se generira u SQL-u je:

Hibernate: odaberite this_.ID kao ID1_0_0_, this_.NAME kao NAME2_0_0_ iz FOO this_ redoslijeda po this_.NAME asc, this_.ID sac

3.3. Postavljanje prioriteta sortiranja null vrijednosti

Prema zadanim postavkama, kada atribut po kojem se sortira ima null vrijednosti, na RDMS-u je da odluči o prednosti. Hibernate Criteria Object API olakšava promjenu tog zadanog i mjesto null na kraju rastućeg poredanog popisa:

Kriteriji kriterija = sess.createCriteria (Foo.class, "FOO"); kriteriji.addOrder (Order.asc ("ime"). nulls (NullPrecedence.LAST));

Ovdje je osnovno SQL upit - pomoću je null, a zatim 1 else 0 klauzula:

Hibernate: odaberite this_.ID kao ID1_1_1_, this_.NAME kao NAME2_1_1_, this_.BAR_ID kao BAR_ID3_1_1_, this_.idx kao idx4_1_1_, bar2_.ID kao ID1_0_0_, bar2_.NAME kao NAME2_0_0_ iz FOO poretka za svaki slučaj null onda.NAME. 1 ostalo 0 kraj, ovo_.NAME uzlazno

Alternativno, možemo i stavite nule na početak silaznog poredanog popisa:

Kriteriji kriterija = sess.createCriteria (Foo.class, "FOO"); kriteriji.addOrder (Order.desc ("ime"). nulls (NullPrecedence.FIRST));

Slijedi odgovarajući SQL upit - s je nula onda 0 else 1 klauzula:

Hibernate: odaberite this_.ID kao ID1_1_1_, this_.NAME kao NAME2_1_1_, this_.BAR_ID kao BAR_ID3_1_1_, this_.idx kao idx4_1_1_, bar2_.ID kao ID1_0_0_, bar2_.NAME kao NAME2_0_0_ iz FOO poretka za svaki slučaj null onda.NAME. 0 else 1 kraj, ovo_.NAME opis

Imajte na umu da, ako je atribut po kojem je sortiran primitivan tip poput int, a PresisitenceException volja bačena.

Na primjer, ako vrijednost f.anIntVariable je null, tada je izvršenje upita:

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

će baciti:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Nulti vrijednost dodijeljena je svojstvu primitivnog postavljača tipa com.cc.jpa.example.Foo.anIntVariable

4. Zaključak

Ovaj članak istražuje sortiranje pomoću hibernacije - koristeći dostupne API-je za jednostavne entitete kao i za entitete u relaciji jedan-prema-mnogima.

Provedbu ovog vodiča za sortiranje hibernacije možete pronaći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.