通过hibernate去调用存储过程
之前一直误以为用了hibernate之后就不可以使用存储过程了
可能是因为跨平台的考虑,好像这方面的资料还真的是上很少介绍(请允许我的孤陋寡闻)
说实话还真看不出来hibernate调用存储过程有什么优势
CREATE TABLE `proctab` ( `id` int ( 11 ) NOT NULL auto_increment, `Name` varchar ( 20 ), `age` int ( 11 ), PRIMARY KEY (`id`) )
简单的存储过程
create PROCEDURE proc() begin select * from proctab; end ;
一种方法是通过hibernate传统的xml映射方式去调用
<class name="com.test.User" table="proctab"> <id name="id" column="id"> <generator column="name" type="string" /> <property name="age" column="age" type="integer" /> </class> <sql-query name="getUser" callable="true"> <return alias="user" column="id" /> <return-property name="name" column="name" /> <return-property name="age" column="age" /> </return> {call proc()} </sql-query> 调用方法
Session ss= HibernateSessionFactory.getSession() List li=ss.getNamedQuery("getUser").list(); ss.close(); 及其类似jdbc的方法
Session session =HibernateSessionFactory.getSession(); Connection conn = session.connection(); ResultSet rs =null; CallableStatement call = conn.prepareCall("{Call proc()}"); rs = call.executeQuery(); rs.close(); session.close(); 这种方法基本上就是jdbc,不过很简单,总是感觉怪怪的~!
还有就是通过强大的createSQLQuery来实现
o(∩_∩)o...哈哈 个人比较喜欢这种方法
Session session =HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("{Call proc()}"); List list =query.list(); session.close(); 如果没有返回值 直接用execute的方法就可以了
(*^__^*) 忘了一个重要的问题就是存储过程的传参问题
Java代码
CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 参数); rs = call.executeQuery(); Java代码
SQLQuery query = session.createSQLQuery("{Call proc(?)}"); query.setString(0, 参数); List list =query.list();