我可以使用休眠标准调用存储过程吗?

时间:2010-03-25 13:05:56

标签: java hibernate stored-procedures criteria

这是我的问题,我必须使用一个大SP,并且没有时间在java中重写。 所以我正在使用Hibernate标准,我不知道我是否可以调用它。谢谢大家。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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;
    }

}

答案 2 :(得分:2)

This document描述了如何映射存储过程的结果,作为本机查询执行。

您无法使用Criteria API执行此操作,但这无关紧要。