最近要学一个hibernate调用游标,找来找去也没找到如何调用,最后看了许多文章,用jdbc方式来调用也是可以的,但是效率上就不行了,因为每次都要连接数据库,从而放弃了hibernate的对象持久化,下面就是整个代码:
希望能帮到有需要的人!!!
SQL 代码
--创建表
create table shop(
sid int primary key no tnull,
sname varchar(20) not null,
price int not null
);
--创建包头,声明游标,两个参数,当前页和每页显示的数量,还有一个游标用于接收返回的结果集
create or replace package pkg_query as
type my_ref_cursor is ref cursor;
procedure pro_query(curpage int,pagesize int,val out my_ref_cursor);
end pkg_query;
--创建包体
create or replace package body pkg_query as
procedure pro_query(curpage int,pagesize int,val out my_ref_cursor)
is
v_sql varchar(1000):='';
begin
v_sql:='select * from (select rownum as rn,sid,sname,price from shop where rownum<= '||curpage*pagesize|| ' )where rn >='||pagesize*(curpage-1);
dbms_output.put_line(v_sql);
open val for v_sql;
end;
end pkg_query;
注意:包头和包体要分开执行
java代码:
public List findByPage(int curpage,int pagesize)
{
List list = null;
try {
//获取存储过程,问号代表参数
CallableStatement csmt = getSession().connection().prepareCall("{call pkg_query.pro_query(?,?,?)}");
//设置参数,可以使用名字或者顺序位置
csmt.setInt("curpage",curpage);
csmt.setInt("pagesize",pagesize);
//设置返回参数
csmt.registerOutParameter("val", oracle.jdbc.OracleTypes.CURSOR);
//执行过程
boolean b = csmt.execute();
//获得打开的游标(结果集)
ResultSet rs = (ResultSet)csmt.getObject("val");
//循环添加就OK了
list = new ArrayList();
while(rs.next())
{
Shop shop = new Shop();
shop.setSid(rs.getLong("sid"));
shop.setSname(rs.getString("sname"));
shop.setPrice(rs.getLong("price"));
list.add(shop);
}
} catch (DataAccessResourceFailureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
希望能帮到有需要的人!!!