Hibernate imenovani upit

1. Pregled

Glavni nedostatak rasipanja HQL-a i SQL-a po objektima za pristup podacima jest taj što kod čini nečitljivim. Stoga bi moglo imati smisla grupirati sve HQL i SQL na jednom mjestu i koristiti samo njihovu referencu u stvarnom kodu za pristup podacima. Srećom, Hibernate nam to omogućuje s imenovanim upitima.

Imenovani upit je statički definirani upit s unaprijed definiranim nepromjenjivim nizom upita. Provjeravaju se kada se kreira tvornica sesija, što dovodi do brzog neuspjeha aplikacije u slučaju pogreške.

U ovom ćemo članku vidjeti kako definirati i koristiti hibernate imenovane upite pomoću @NamedQuery i @NamedNativeQuery bilješke.

2. Entitet

Pogledajmo prvo entitet koji ćemo koristiti u ovom članku:

@Entity javna klasa DeptE Employee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; private String workerNumber; oznaka privatnog niza; privatni naziv niza; @ManyToOne privatni odjel odjela; // geteri i postavljači}

U našem primjeru dobit ćemo zaposlenika na temelju broja zaposlenika.

3. Imenovani upit

Da bismo to definirali kao imenovani upit, upotrijebit ćemo org.hibernate.annotations.NamedQuery bilješka. Proširuje javax.postojanost.NameedQuery sa značajkama hibernacije.

Definirat ćemo ga kao bilješku Zaposlenik odjela razred:

@ org.hibernate.annotations.NamedQuery (name = "DeptEfficiee_findByEfficieeNumber", query = "iz DeptEfficiee where workerNumber =: workerNo") 

Važno je napomenuti da svaki @NamedQuery napomena je pridružena točno jednoj klasi entiteta ili mapiranoj superklasi. Ali,budući da je opseg imenovanih upita cijela jedinica postojanosti, trebali bismo pažljivo odabrati naziv upita kako bismo izbjegli koliziju. A to smo postigli upotrebom naziva entiteta kao prefiksa.

Ako imamo više imenovanih upita za entitet, koristit ćemo @NamedQueries napomena za grupiranje ovih:

@ org.hibernate.annotations.NamedQueries ({@ org.hibernate.annotations.NamedQuery (name = "DeptEfficiee_FindByEfficieeNumber", query = "from DeptEfficiee where workerNumber =: workerNo"), @ org.hibernate.Notations.Notations.Notacije DeptEfficiee_FindAllByDesgination ", query =" iz DeptE Employeea gdje je oznaka =: oznaka "), @ org.hibernate.annotations.NamedQuery (name =" DeptEfficiee_UpdateEfficieeDepartment ", query =" Ažuriraj DeptEfficieep set odjel = newNumDeep set odjela = NewNumDeep odjel = NewNumDeep odjel = NewNumDeep odjel = NewNumDeep set odjeljenja = NewNumDeep odjel = NewNumDeep Set odjeljenja = NewNumDeep odjel = NewDumDeep odjel = NewDumDeep odjel = NewDumDeep Set odjeljenja = NewDeumEep odjel = NewDeumEep set odjeljenja = NewDeumEep odjel = NewDeumEeep set odjeljaka ..})

Imajte na umu da HQL upit može biti operacija u DML stilu. Dakle, ne treba biti Odaberi samo izjava. Na primjer, možemo imati upit za ažuriranje kao u DeptEfficiee_UpdateEfficieeDesignation iznad.

3.1. Konfiguriranje značajki upita

Pomoću alata možemo postaviti razne značajke upita @NamedQuery bilješka. Pogledajmo primjer:

@ org.hibernate.annotations.NamedQuery (name = "DeptEfficiee_FindAllByDepartment", query = "iz DeptEcpréeeea gdje je odjel =: odjel", timeout = 1, fetchSize = 10)

Ovdje smo konfigurirali interval čekanja i veličinu dohvaćanja. Osim ove dvije, možemo postaviti i značajke kao što su:

  • može se predmemorirati - je li upit (rezultati) moguće predmemorirati ili ne
  • cacheMode - način predmemorije koji se koristi za ovaj upit; ovo može biti jedno od DOBITI, IGNORIRATI, NORMALNO, STAVITI, ili OSVJEŽITI
  • cacheRegion - ako se rezultati upita mogu predmemorirati, imenujte područje predmemorije upita koje ćete koristiti
  • komentar - komentar dodan generiranom SQL upitu; ciljano za DBA
  • flushMode - način ispiranja za ovaj upit, jedan od UVIJEK, AUTO, OBVEZI, RUČNO, ili PERSISTENCE_CONTEXT

3.2. Upotreba imenovanog upita

Sad kad smo definirali imenovani upit, upotrijebimo ga za dohvaćanje zaposlenika:

Upit upita = session.createNamedQuery ("DeptEfficiee_FindByEfficieeNumber", DeptEfficiee.class); query.setParameter ("workerNo", "001"); DeptEfficiee rezultat = query.getSingleResult (); 

Evo, koristili smo createNamedQuery metoda. Uzima naziv upita i vraća znak org.hibernate.query.Query objekt.

4. Nazvani izvorni upit

Kao i HQL upite, također možemo definirati izvorni SQL kao imenovani upit. Da bismo to učinili, možemo koristiti @NamedNativeQuery bilješka. Iako je sličan @NamedQuery, potrebna je malo veća konfiguracija.

Istražimo ovu napomenu na primjeru:

@ org.hibernate.annotations.NamedNativeQueries (@ org.hibernate.annotations.NamedNativeQuery (name = "DeptEfficiee_GetEfficieeByName", query = "select * from deptemployee emp where name =: name", resultClass = DeptEfficiee.class)

Budući da je ovo izvorni upit, morat ćemo Hibernate-u reći na koju klasu entiteta mapirati rezultate. Slijedom toga, koristili smo resultClass svojstvo za ovo.

Drugi način mapiranja rezultata je upotreba resultSetMapping imovine. Ovdje možemo odrediti naziv unaprijed definiranog SQLResultSetMapping.

Imajte na umu da možemo koristiti samo jedan od resultClass i resultSetMapping.

4.1. Upotreba imenovanog izvornog upita

Da bismo koristili imenovani izvorni upit, možemo koristiti Session.createNamedQuery ():

Upit upita = session.createNamedQuery ("DeptEfficiee_FindByEfficieeName", DeptEfficiee.class); query.setParameter ("ime", "John Wayne"); DeptEfficiee rezultat = query.getSingleResult ();

Ili Session.getNamedNativeQuery ():

NativeQuery query = session.getNamedNativeQuery ("DeptEfficiee_FindByEfficieeName"); query.setParameter ("ime", "John Wayne"); Rezultat DeptEfficiee = (DeptEfficiee) query.getSingleResult ();

Jedina razlika između ova dva pristupa je vrsta povratka. Drugi pristup vraća a NativeQuery, što je podrazred od Upit.

5. Pohranjeni postupci i funkcije

Možemo koristiti @NamedNativeQuery napomena za definiranje poziva i na pohranjene procedure i funkcije:

@ org.hibernate.annotations.NamedNativeQuery (name = "DeptEfficiee_UpdateEfficieeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION (: workerNumber,: newDesignation)", resultClass = DeptEfficiee.class)

Primijetite da smo, iako je ovo upit za ažuriranje, koristili resultClass imovine. To je zato što Hibernate ne podržava čisto nativne skalarne upite. A način za rješavanje problema je postavljanje a resultClass ili a resultSetMapping.

6. Zaključak

U ovom smo članku vidjeli kako definirati i koristiti imenovane HQL i nativne upite.

Izvorni kod dostupan je na GitHub-u.


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