2010-03-25 17 views
7

To jest mój problem, muszę używać dużego SP, i nie ma czasu na przepisywanie w Javie. Używam kryteriów Hibernate i nie wiem, czy mogę to nazwać. Dziękuje za wszystko.Czy mogę wywołać procedurę przechowywaną z kryteriami hibernacji?

+0

Hibernate pozwala także na wykonywanie połączeń bazy danych bezpośrednio. Możesz też zrobić to w ten sposób. –

+1

Dzięki fot odpowiedź, ale jak mogę to zrobić? – Gaston

Odpowiedz

5

Patrz dokumentacja referencyjna: Using stored procedures for querying.

Odwzorowane kwerendy są wywoływane w ten sposób.

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

Zmapowane zapytanie może zwracać encje.

<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 opisuje jak mapować wynik procedury przechowywanej, wykonane jako native zapytania.

Nie można tego zrobić za pomocą API Criteria, ale nie powinno to mieć znaczenia.

5

Nie, musisz użyć zapytania natywnego. Jeśli używasz adnotacji, zobacz 2.3.2. Mapping native queries.

Poniżej przykład:

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

I to nazwać:

@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

Dzięki Thivent, ale nie używamy denerwacji :( – Gaston

+0

@Gaston Następnie odwołaj się do odpowiedzi Lachlana. –

Powiązane problemy