我已经能够在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>然后在我的Profesor类中,我有以下代码:
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那样有"name“属性。
使用<"sql-query">,我们可以这样做:
Query query =session.getNamedQuery("getProfesors");就像我之前展示的那样,但是因为sql-insert没有这个属性名,所以我不知道该怎么做。我还被迫使用存储过程,因为这是一个非常特殊的要求,否则我会使用其他Hibernate持久化特性。
任何帮助都将不胜感激。
发布于 2012-05-14 14:31:09
另一种方法是从准备好的语句中调用存储的proc。如果存储过程更新多个记录(批量更新),这可能很有用。
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()方法,我们可以使用:
PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider()
.getConnection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();发布于 2012-04-05 13:25:20
可以为insert、update和delete指定“自定义sql”。关于这一点,请咨询the documentation。
这些不是命名查询。当Hibernate插入、更新或删除此实体时,将始终使用它们。
https://stackoverflow.com/questions/10022946
复制相似问题