Hibernate Named Query

1. Oversikt

En stor ulempe med å ha HQL og SQL spredt over datatilgangsobjekter er at det gjør koden uleselig. Derfor kan det være fornuftig å gruppere alle HQL og SQL på ett sted og bare bruke referansen deres i den faktiske datatilgangskoden. Heldigvis lar dvalemodus oss gjøre dette med navngitte spørsmål.

Et navngitt spørsmål er et statisk definert spørsmål med en forhåndsdefinert uforanderlig spørringsstreng. De valideres når øktfabrikken er opprettet, og gjør at applikasjonen mislykkes raskt i tilfelle en feil.

I denne artikkelen vil vi se hvordan du definerer og bruker Hibernate Named Queries ved hjelp av @NamedQuery og @NamedNativeQuery kommentarer.

2. Enheten

La oss først se på enheten vi skal bruke i denne artikkelen:

@Entity offentlig klasse DeptEmployee {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE) privat lang id; privat String ansattNummer; privat streng betegnelse; privat strengnavn; @ManyToOne privat avdeling; // getters og setters}

I vårt eksempel henter vi en ansatt basert på deres ansattnummer.

3. Navngitt spørring

For å definere dette som et navngitt spørsmål, bruker vi org.hibernate.annotations.NamedQuery kommentar. Det utvider javaxen.persistence.NamedQuery med dvalemodus-funksjoner.

Vi definerer det som en kommentar til Avdeling Ansatt klasse:

@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_findByEmployeeNumber", query = "from DeptEmployee where employeeNumber =: employeeNo") 

Det er viktig å merke seg at hver @NamedQuery kommentar er knyttet til nøyaktig en enhetsklasse eller kartlagt superklasse. Men,Siden omfanget av navngitte spørringer er hele utholdenhetsenheten, bør vi velge navnet på spørringen nøye for å unngå en kollisjon. Og vi har oppnådd dette ved å bruke enhetsnavnet som et prefiks.

Hvis vi har mer enn ett navngitt spørsmål for en enhet, bruker vi @NamedQueries kommentar for å gruppere disse:

@ org.hibernate.annotations.NamedQueries ({@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber =: employeeNo"), @ org.hibernate.annotations.NamedQuer " DeptEmployee_FindAllByDesgination ", spørring =" fra DeptEmployee hvor betegnelse =: betegnelse "), @ org.hibernate.annotations.NamedQuery (navn =" DeptEmployee_UpdateEmployeeDepartment ", spørring =" Oppdater DeptEmployee sett avdeling = hvor ansatt: ansatt: ansatt: ansatt: ansatt: ansatt: ansatt: ansatt: medarbeideravdeling: ..})

Merk at HQL-spørringen kan være en DML-stil operasjon. Så det trenger ikke å være en å velge kun uttalelse. For eksempel kan vi ha et oppdateringsspørsmål som i DeptEmployee_UpdateEmployeeDesignation ovenfor.

3.1. Konfigurere søkefunksjoner

Vi kan sette forskjellige søkefunksjoner med @NamedQuery kommentar. La oss se på et eksempel:

@ org.hibernate.annotations.NamedQuery (navn = "DeptEmployee_FindAllByDepartment", spørring = "fra DeptEmployee hvor avdeling =: avdeling", timeout = 1, fetchSize = 10)

Her har vi konfigurert tidsavbruddsintervallet og hentestørrelsen. Bortsett fra disse to, kan vi også angi funksjoner som:

  • cacheable - om spørringen (resultatene) kan caches eller ikke
  • cacheMode - hurtigbuffermodus som brukes for dette spørsmålet; dette kan være en av FÅ, IGNORE, NORMAL, PUT, eller FORFRISKE
  • cache Region - hvis søkeresultatene kan caches, gi navnet til hurtigbufferegionen som skal brukes
  • kommentar - en kommentar lagt til det genererte SQL-spørringen; målrettet for DBA
  • flushMode - skyllemodus for dette spørsmålet, en av ALLTID, AUTO, FORPLIKT, MANUELL, eller PERSISTENCE_CONTEXT

3.2. Bruke den navngitte spørringen

Nå som vi har definert den navngitte spørringen, la oss bruke den til å hente en ansatt:

Query query = session.createNamedQuery ("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); query.setParameter ("ansattNr", "001"); DeptEmployee result = query.getSingleResult (); 

Her har vi brukt createNamedQuery metode. Det tar navnet på spørringen og returnerer en org.hibernate.query.Query gjenstand.

4. Navngitt innfødt spørring

I tillegg til HQL-spørsmål, kan vi også definere native SQL som et navngitt spørsmål. For å gjøre dette kan vi bruke @NamedNativeQuery kommentar. Selv om det ligner på @NamedQuery, det krever litt mer konfigurasjon.

La oss utforske denne merknaden ved hjelp av et eksempel:

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

Siden dette er et innfødt spørsmål, må vi fortelle dvalemodus hvilken enhetsklasse resultatene skal tilordnes. Derfor har vi brukt resultatKlasse eiendom for å gjøre dette.

En annen måte å kartlegge resultatene på er å bruke resultSetMapping eiendom. Her kan vi spesifisere navnet på en forhåndsdefinert SQLResultSetMapping.

Merk at vi bare kan bruke en av resultatKlasse og resultSetMapping.

4.1. Bruke den navngitte innfødte spørringen

For å bruke det navngitte innfødte spørringen, kan vi bruke Session.createNamedQuery ():

Query query = session.createNamedQuery ("DeptEmployee_FindByEmployeeName", DeptEmployee.class); query.setParameter ("navn", "John Wayne"); DeptEmployee result = query.getSingleResult ();

Eller Session.getNamedNativeQuery ():

NativeQuery-spørring = session.getNamedNativeQuery ("DeptEmployee_FindByEmployeeName"); query.setParameter ("navn", "John Wayne"); DeptEmployee result = (DeptEmployee) query.getSingleResult ();

Den eneste forskjellen mellom disse to tilnærmingene er returtypen. Den andre tilnærmingen returnerer a NativeQuery, som er en underklasse av Spørsmål.

5. Lagrede prosedyrer og funksjoner

Vi kan bruke @NamedNativeQuery kommentar for å definere samtaler til lagrede prosedyrer og funksjoner også:

@ org.hibernate.annotations.NamedNativeQuery (name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION (: employeeNumber,: newDesignation)", resultClass = DeptEmployee.class)

Legg merke til at selv om dette er et oppdateringsspørsmål, har vi brukt resultatKlasse eiendom. Dette er fordi dvalemodus ikke støtter rene innfødte skalære spørsmål. Og måten å omgå problemet på er å enten sette en resultatKlasse eller a resultSetMapping.

6. Konklusjon

I denne artikkelen så vi hvordan du definerer og bruker navngitte HQL og innfødte spørsmål.

Kildekoden er tilgjengelig på GitHub.


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