0

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

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

<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>

然后在我的教授课程中,我有以下代码:

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。

我尝试了这样的事情但没有成功:

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 那样的“名称”属性。

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

 Query query =session.getNamedQuery("getProfesors");

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

任何帮助将非常感激。

4

2 回答 2

1

您可以为插入、更新和删除指定“自定义 sql”。请参阅有关它的文档

这些不是命名查询。当 Hibernate 插入、更新或删除这个实体时,它们总是被使用。

于 2012-04-05T05:25:19.813 回答
0

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

PreparedStatement ps = getSession().connection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();

但请注意:自 Hibernate 3.2.4 ( https://hibernate.onjira.com/browse/HHH-2603 )以来,休眠会话的 connection() 方法已被弃用。

PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider()
                    .getConnection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();
于 2012-05-14T06:31:08.523 回答