hibernate是否支持视图以及存储过程呢?
Hibernate2支持视图,不支持存储过程
Hibernate3支持视图,也支持存储过程
1. 其实视图和表对于Hibernate来说,并无任何区别,你是如何应用表,就是如何应用视图。
2.Hibernate3调用存储过程
为了在Hibernate中使用存储过程,你必须遵循一些规则,不遵循这些规则的存储过程将不可用.如果你仍然想要使用他们,这些规则针对于不同的数据库.因为数据库提供商有各种不同的存储过程语法和语义:
(一)必须通过session.connection()
来执行他们。
(二)对存储过程进行的查询无法使用setFirstResult()/setMaxResults()
进行分页。
(三)对于Oracle有如下规则:
函数必须返回一个结果集。存储过程的第一个参数必须是OUT
,它返回一个结果集。这是通过Oracle 9或10的SYS_REFCURSOR
类型来完成的。在Oracle中你需要定义一个REF CURSOR
类型,参见Oracle的手册。
(四)对于Sybase或者MS SQL server有如下规则:
存储过程必须返回一个结果集。注意如果servers可能返回多个结果集以及更新的数目,Hibernate将取出第一条结果集作为它的返回值,其他将被丢弃。 如果你能够在存储过程里设定SET NOCOUNT ON
,这可能会效率更高,但这不是必需的。
-
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" column="id">
-
class="native"/>
-
-
"name" column="name" type="string" />
-
"age" column="age" type="integer" />
-
</class>
-
"getUser" callable="true">
-
<return alias="user" class="com.test.User">
-
<return-property name="id" column="id" />
-
<return-property name="name" column="name" />
-
<return-property name="age" column="age" />
-
</return>
-
{call proc()}
-
调用方法
-
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的方法就可以了
(*^__^*) 忘了一个重要的问题就是存储过程的传参问题
-
CallableStatement call = conn.prepareCall("{Call proc(?)}");
-
call.setString(1, ????);
-
rs = call.executeQuery();
-
SQLQuery query = session.createSQLQuery("{Call proc(?)}");
-
query.setString(0, ????);
-
List list =query.list();