首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Hibernate执行插入SQL Server存储过程?

如何从Hibernate执行插入SQL Server存储过程?
EN

Stack Overflow用户
提问于 2012-04-05 13:08:29
回答 2查看 6.8K关注 0票数 0

我已经能够在hibernate中执行存储过程来将结果查询映射到Java Bean。

例如,我有一个名为Profesor.hbm.xml的文件:

代码语言:javascript
复制
<hibernate-mapping>
        <class name="model.Profesor" table="Profesor" catalog="dbo">
            <id name="idProfesor" type="int">
                <column name="idProfesor" />
                <generator class="assigned" />
            </id>
        <property name="Nombre" type="string">
            <column name="Nombre"  length="25" not-null="false" />
        </property>
        <property name="ApellidoP" type="string">
            <column name="ApellidoP" length="20" not-null="false" />
        </property>

        <property name="ApellidoM" type="string">
            <column name="ApellidoM" length="20" not-null="false" />
        </property>
            </class>

        <sql-query name="getProfesors" callable="true">
        <return alias="getProfesors" class="model.Profesor">

        <return-property name="idProfesor" column="idProfesor"/>
        <return-property name="Nombre" column="Nombre"/>
        <return-property name="ApellidoP" column="ApellidoP"/>
        <return-property name="ApellidoM" column="ApellidoM"/>
        </return>
        exec getProfesors :idTT
        </sql-query>
</hibernate-mapping>

然后在我的Profesor类中,我有以下代码:

代码语言:javascript
复制
SessionFactory sf = new Configuration().configure().buildSessionFactory();
session = sf.getCurrentSession();

public List <Profesor> getProfesors(String idTT){
    session.beginTransaction();

    query.setString("idTT", idTT);

return query.list();
}

这工作得很好,我没有问题,存储过程会执行,它会用结果填充我的名为Profesor的模型类。

现在我有了另一个存储过程,它插入数据以在数据库中创建一个新的Profesor。

我尝试过这样的东西,但没有成功:

代码语言:javascript
复制
session.beginTransaction();
Connection c = session.connection();
CallableStatement cs = c.prepareCall( "{call addProfesor(?,?,?)}" ) ;
cs.setString(1, "George");
cs.setString(2, "Williams");
cs.setString(3, "Mathematics");

cs.executeUpdate();

它甚至没有向我显示错误消息,数据就是不会插入。我还读到,就像有一个<" sql-query ">标记一样,有一个<"sql-insert">,但是我看不到调用<"sql-insert">的方法,因为它没有像sql-query那样有"name“属性。

使用<"sql-query">,我们可以这样做:

代码语言:javascript
复制
 Query query =session.getNamedQuery("getProfesors");

就像我之前展示的那样,但是因为sql-insert没有这个属性名,所以我不知道该怎么做。我还被迫使用存储过程,因为这是一个非常特殊的要求,否则我会使用其他Hibernate持久化特性。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-14 14:31:09

另一种方法是从准备好的语句中调用存储的proc。如果存储过程更新多个记录(批量更新),这可能很有用。

代码语言:javascript
复制
PreparedStatement ps = getSession().connection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();

请注意: hibernate会话的connection()方法从Hibernate 3.2.4 (https://hibernate.onjira.com/browse/HHH-2603)开始就被弃用了。暂时不推荐使用Hibernate sessions的connection()方法,我们可以使用:

代码语言:javascript
复制
PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider()
                    .getConnection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();
票数 0
EN

Stack Overflow用户

发布于 2012-04-05 13:25:20

可以为insert、update和delete指定“自定义sql”。关于这一点,请咨询the documentation

这些不是命名查询。当Hibernate插入、更新或删除此实体时,将始终使用它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10022946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档