2010-03-25 4 views
7

Это моя проблема, я должен использовать большой SP, и нет времени переписывать в java. Итак, я использую критерии Hibernate, и я не знаю, могу ли я назвать это. Спасибо всем.Могу ли я вызвать хранимую процедуру с критериями спящего режима?

+0

Hibernate также позволяет выполнять базы данных вызовов непосредственно. Вы также можете сделать это именно так. –

+1

Спасибо за ваш ответ, но как я могу это сделать? – Gaston

ответ

5

См. Using stored procedures for querying в справочной документации.

Соответствующие запросы вызываются так.

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

Отображаемый запрос может возвращать объекты.

<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 описывает, как отобразить результат хранимой процедуры, выполняемой в качестве родного запроса.

Вы не можете сделать это с помощью API критериев, но это не имеет значения.

5

Нет, вам нужно использовать собственный запрос. Если вы используете аннотации, см. 2.3.2. Mapping native queries.

Ниже приведен пример:

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

И называть его:

@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

Спасибо Thivent, но мы не используем аннотации :( – Gaston

+0

@Gaston Затем обратитесь к ответу Лаклана. –

Смежные вопросы