Java >> Java tutorial >  >> Tag >> return

Hibernate Tips:Sådan kalder du en funktion, der returnerer en SYS_REFCURSOR

Hibernate Tips er en række indlæg, hvor jeg beskriver en hurtig og nem løsning på almindelige Hibernate-spørgsmål. Hvis du har et spørgsmål til et fremtidigt Hibernate Tip, bedes du efterlade en kommentar nedenfor.

Spørgsmål:

Vi bruger en Oracle-database, og jeg skal kalde en funktion, der returnerer en SYS_REFCURSOR . Jeg prøvede at kalde det som en indbygget forespørgsel, men det virkede ikke. Er der nogen måde at kalde denne funktion med JPA eller Hibernate?

Løsning:

Du kan kalde en sådan funktion ved at erklære en Hibernate-specifik @NamedNativeQuery som udvider JPA's @NamedNativeQuery . Lad os tage et kig på et eksempel.

Databasefunktionen

Følgende forespørgsel returnerer alle anmeldelser af en bog med et givet id. Den største forskel mellem denne funktion og andre funktioner, som du kan kalde i en JPQL-forespørgsel, er dens returtype. SYS_REFCURSOR er en pegepind til resultatet af en forespørgsel. Den, der ringer til funktionen, kan bruge denne markør til at læse så mange poster fra resultatsættet, som han vil. Det gør også funktionen lidt sværere at kalde via JPA.

create or replace FUNCTION getReviews ( 
    bookId IN NUMBER ) 
    RETURN SYS_REFCURSOR 
IS
    reviews SYS_REFCURSOR; 
BEGIN
   OPEN reviews FOR
        SELECT r.id, r.message, r.rating, r.book_id, r.version
       FROM review r 
       WHERE r.book_id = bookId; 
   RETURN reviews; 
END;

Hibernates @NamedNativeQuery

Du kan bruge JPAs indbyggede forespørgsel til at kalde funktioner, der returnerer værdier af simple typer, såsom int eller streng . Desværre virker det ikke for funktioner, der returnerer Oracles SYS_REFCURSOR .

Men Hibernates egen org.hibernate.annotations.NamedNativeQuery annotation giver dig mulighed for at kalde disse funktioner. Det udvider JPA @NamedNativeQuery annotering af den opkaldbare attribut. Hvis du indstiller den til sand , fortæller du Hibernate, at denne forespørgsel kalder en databasefunktion eller en lagret procedure. Følgende kodestykke viser erklæringen af ​​en sådan @NamedNativeQuery .

import org.hibernate.annotations.NamedNativeQuery;

@Entity
@NamedNativeQuery(
		name = "getReviews", 
		callable = true, 
		query = "{? = call GETREVIEWS(?)}",
		resultClass = Review.class)
public class Review {...}

En yderligere faldgrube, du skal være opmærksom på, er, at Hibernate 5.2 kræver, at du definerer en resultatkortlægning. Hvis du ikke angiver en resultClass eller referer til en resultSetMapping , det kaster en NotYetImplementedException .

I dette eksempel vælger min funktion alle kolonner fra gennemgangen bord. Jeg bruger resultClass attribut for at bede Hibernate om at knytte hver post til en administreret anmeldelse enhed.

resultSetMapping attribut refererer til en @SqlResultSetMapping definition. Enhver @SqlResultSetMapping giver dig mulighed for at definere, hvordan forespørgselsresultatet skal tilknyttes entiteter, POJO'er og skalære værdier. Du kan bruge det til at oprette kortlægninger af enhver kompleksitet. Jeg forklarede de forskellige kortlægningsmuligheder i detaljer i en række artikler.

OK, lad os lukke denne artikel ved at udføre forespørgslen og kalde GETREVIEWS funktion.

Opkald til den oprindelige forespørgsel

Du kan ringe til Hibernates @NamedNativeQuery på samme måde som du kalder enhver anden navngiven forespørgsel. Du behøver kun at kalde createNamedQuery af din EntityManager med navnet på forespørgslen, indstil alle bind-parameterværdier og kald getSingleResult eller getResultList metode.

TypedQuery<Review> q = em.createNamedQuery("getReviews", Review.class);
q.setParameter(0, 1);
List<Review> reviews = q.getResultList();

Når du udfører det forrige kodestykke og aktiverer logningen af ​​SQL-sætninger, kan du se følgende SQL-sætning i logfilen.

10:19:15,400 DEBUG [org.hibernate.SQL] - {? = call GETREVIEWS(?)}

Få flere oplysninger:

Hvis du kalder funktioner på en Oracle-database, vil du måske også læse følgende artikler:

  • Sådan kalder du lagrede procedurer i JPA
  • Sådan kalder du lagrede procedurer i JPA – Del 2
  • Sådan kalder du brugerdefinerede databasefunktioner med JPA og Hibernate

Dvaletipsbog







Få flere opskrifter som denne i min nye bog Hibernate Tips:Mere end 70 løsninger på almindelige dvaleproblemer.

Den giver dig mere end 70 klar-til-brug opskrifter til emner som grundlæggende og avancerede kortlægninger, logning, Java 8-understøttelse, caching og statisk og dynamisk definerede forespørgsler.

Få det nu!



No
Java tag