Dvaletilstand navngivet forespørgsel

1. Oversigt

En stor ulempe ved at have HQL og SQL spredt over dataadgangsobjekter er, at det gør koden ulæselig. Derfor kan det være fornuftigt at gruppere al HQL og SQL på ét sted og kun bruge deres reference i den aktuelle dataadgangskode. Heldigvis giver dvale os mulighed for at gøre dette med navngivne forespørgsler.

En navngivet forespørgsel er en statisk defineret forespørgsel med en foruddefineret uforanderlig forespørgselsstreng. De valideres, når sessionfabrikken oprettes, hvilket gør, at applikationen fejler hurtigt i tilfælde af en fejl.

I denne artikel vil vi se, hvordan du definerer og bruger Hibernate Named Queries ved hjælp af @NamedQuery og @NamedNativeQuery kommentarer.

2. Enheden

Lad os først se på den enhed, vi bruger i denne artikel:

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

I vores eksempel henter vi en medarbejder baseret på deres medarbejdernummer.

3. Navngivet forespørgsel

For at definere dette som en navngivet forespørgsel bruger vi org.hibernate.annotations.NamedQuery kommentar. Det udvider javaxen.persistence.NamedQuery med dvale-funktioner.

Vi definerer det som en kommentar til Afdeling Medarbejder klasse:

@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_findByEmployeeNumber", query = "fra DeptEmployee hvor medarbejderNummer =: medarbejderNo") 

Det er vigtigt at bemærke, at hver @NamedQuery annotering er knyttet til nøjagtigt en enhedsklasse eller kortlagt superklasse. Men,Da omfanget af navngivne forespørgsler er hele persistensenheden, skal vi vælge forespørgselsnavnet omhyggeligt for at undgå en kollision. Og vi har opnået dette ved at bruge enhedsnavnet som et præfiks.

Hvis vi har mere end én navngivet forespørgsel til en enhed, bruger vi @NamedQueries kommentar til at gruppere disse:

@ org.hibernate.annotations.NamedQueries ({@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber =: employeeNo"), @ org.hibernate.annotations.NamedQ " DeptEmployee_FindAllByDesgination ", forespørgsel =" fra DeptEmployee hvor betegnelse =: betegnelse "), @ org.hibernate.annotations.NamedQuery (navn =" DeptEmployee_UpdateEmployeeDepartment ", forespørgsel =" Opdater DeptEmployee sæt afdeling: hvor medarbejder: medarbejder). ..})

Bemærk, at HQL-forespørgslen kan være en operation i DML-stil. Så det behøver ikke at være en Vælg kun erklæring. For eksempel kan vi have en opdateringsforespørgsel som i DeptEmployee_UpdateEmployeeDesignation over.

3.1. Konfiguration af forespørgselsfunktioner

Vi kan indstille forskellige forespørgselsfunktioner med @NamedQuery kommentar. Lad os se på et eksempel:

@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_FindAllByDepartment", forespørgsel = "fra DeptEmployee hvor department =: department", timeout = 1, fetchSize = 10)

Her har vi konfigureret timeoutintervallet og hentningsstørrelsen. Bortset fra disse to kan vi også indstille funktioner som:

  • cacheable - om forespørgslen (resultater) kan caches eller ej
  • cacheMode - cache-tilstanden, der bruges til denne forespørgsel; dette kan være en af FÅ, IGNORER, NORMAL, PUT, eller OPDATER
  • cache Region - hvis forespørgselsresultaterne kan caches, skal du navngive den forespørgselscache-region, der skal bruges
  • kommentar - en kommentar tilføjet til den genererede SQL-forespørgsel; målrettet mod DBA'er
  • flushMode - skylningstilstanden for denne forespørgsel, en af ALTID, AUTO, KOMMER, MANUEL, eller PERSISTENCE_CONTEXT

3.2. Brug af den navngivne forespørgsel

Nu hvor vi har defineret den navngivne forespørgsel, lad os bruge den til at hente en medarbejder:

Forespørgselsforespørgsel = session.createNamedQuery ("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); query.setParameter ("medarbejderNo", "001"); DeptEmployee result = query.getSingleResult (); 

Her har vi brugt createNamedQuery metode. Det tager navnet på forespørgslen og returnerer en org.hibernate.query.Query objekt.

4. Navngivet oprindelig forespørgsel

Ud over HQL-forespørgsler kan vi også definere native SQL som en navngivet forespørgsel. For at gøre dette kan vi bruge @NamedNativeQuery kommentar. Selvom det ligner @NamedQuery, det kræver lidt mere konfiguration.

Lad os udforske denne kommentar ved hjælp af et eksempel:

@ org.hibernate.annotations.NamedNativeQueries (@ org.hibernate.annotations.NamedNativeQuery (name = "DeptEmployee_GetEmployeeByName", forespørgsel = "vælg * fra deptemployee emp hvor name =: name", resultClass = DeptEmployee.class))

Da dette er en indfødt forespørgsel, bliver vi nødt til at fortælle dvale, hvilken enhedsklasse resultaterne skal kortlægges til. Derfor har vi brugt resultatKlasse ejendom til at gøre dette.

En anden måde at kortlægge resultaterne på er at bruge resultSetMapping ejendom. Her kan vi specificere navnet på en foruddefineret SQLResultSetMapping.

Bemærk, at vi kun kan bruge en af resultatKlasse og resultSetMapping.

4.1. Brug af den navngivne oprindelige forespørgsel

For at bruge den navngivne oprindelige forespørgsel kan vi bruge Session.createNamedQuery ():

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

Eller den Session.getNamedNativeQuery ():

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

Den eneste forskel mellem disse to tilgange er returtypen. Den anden tilgang returnerer a NativeQuery, som er en underklasse af Forespørgsel.

5. Gemte procedurer og funktioner

Vi kan bruge @NamedNativeQuery kommentar til også at definere opkald til lagrede procedurer og funktioner:

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

Bemærk, at selvom dette er en opdateringsforespørgsel, har vi brugt resultatKlasse ejendom. Dette skyldes, at dvale ikke understøtter rene native skalære forespørgsler. Og måden at omgå problemet på er enten at indstille en resultatKlasse eller a resultSetMapping.

6. Konklusion

I denne artikel så vi, hvordan vi definerede og brugte navngivne HQL og native forespørgsler.

Kildekoden er tilgængelig på GitHub.


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