2010-03-25 3 views
7

Das ist mein Problem, ich muss einen großen SP verwenden, und es gibt keine Zeit in Java neu zu schreiben. Also verwende ich Hibernate-Kriterien und ich weiß nicht, ob ich es nennen kann. Dank an alle.Kann ich eine gespeicherte Prozedur mit Hibernate-Kriterien aufrufen?

+0

Hibernate können Sie auch Datenbank auszuführen Anrufe direkt. Du könntest es auch so machen. –

+1

Danke für deine Antwort, aber wie kann ich das tun? – Gaston

Antwort

5

Siehe Using stored procedures for querying in der Referenzdokumentation.

Zugeordnete Abfragen werden wie folgt aufgerufen.

List employment = sess.getNamedQuery("BigSP") 
    .list(); 

Eine zugeordnete Abfrage kann Entitäten zurückgeben.

<sql-query name="BigSP" callable="true"> 
    <return alias="emp" class="Employment"> 
     <return-property name="employee" column="EMPLOYEE"/> 
     <return-property name="employer" column="EMPLOYER"/> 
     <return-property name="startDate" column="STARTDATE"/> 
     <return-property name="endDate" column="ENDDATE"/> 
     <return-property name="regionCode" column="REGIONCODE"/> 
     <return-property name="id" column="EID"/> 
     <return-property name="salary"> 
      <return-column name="VALUE"/> 
      <return-column name="CURRENCY"/> 
     </return-property> 
    </return> 
    { call BigSP } 
</sql-query> 
2

This document beschreibt, wie das Ergebnis einer gespeicherten Prozedur zur Karte, als native Abfrage ausgeführt.

Sie können dies nicht mit der Kriterien-API tun, aber das sollte keine Rolle spielen.

5

Nein, Sie müssen eine native Abfrage verwenden. Wenn Sie Anmerkungen verwenden, lesen Sie 2.3.2. Mapping native queries.

Im Folgenden ein Beispiel:

@Entity 
@NamedNativeQuery(
    name="baz", 
    query="call fooProc(:bar, :i)", 
    callable=true, 
    readOnly=true, 
    resultClass=Foo.class 
) 
public class Foo { 
    private Date when; 
    //... 
} 

Und es zu nennen:

@Stateless 
public class FooBean implements FooLocal { 
    @PersistenceContext EntityManager em; 

    public Foo getAFoo(string bar, int i) { 
    Foo result = (Foo)em.createNamedQuery("baz").setParameter("bar", bar).setParameter("i", i).getSingleResult(); 
    return result; 
    } 

} 
+0

Danke Thivent, aber wir verwenden keine Annotationen :( – Gaston

+0

@Gaston Dann siehe Lachlans Antwort. –