2010-03-25 41 views
7

Este es mi problema, tengo que usar un gran SP, y no hay tiempo para reescribir en java. Así que estoy usando los criterios de Hibernate y no sé si puedo llamarlo. Gracias a todos.¿Puedo llamar a un procedimiento almacenado con criterios de hibernación?

+0

Hibernate también le permite ejecutar bases de datos llama directa. También podrías hacerlo de esa manera. –

+1

Gracias por su respuesta, pero ¿cómo puedo hacer eso? – Gaston

Respuesta

5

Consulte Using stored procedures for querying en la documentación de referencia.

Las consultas mapeadas se llaman así.

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

Una consulta mapeada puede devolver entidades.

<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 describe cómo asignar el resultado de un procedimiento almacenado, ejecutado como una consulta nativa.

No puede hacerlo con la API de Criteria, pero esto no debería importar.

5

No, necesita utilizar una consulta nativa. Si está usando anotaciones, vea 2.3.2. Mapping native queries.

A continuación un ejemplo:

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

Y llamarlo:

@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

Gracias Thivent, pero no usamos molestias :( – Gaston

+0

@Gaston Luego consulte la respuesta de Lachlan. –

Cuestiones relacionadas