日期:2014-05-17  浏览次数:20640 次

用HIBERNATE提取游标调用存储过程问题
本帖最后由 qiyewutingxue 于 2012-11-08 18:25:36 编辑 我知道怎么在JAVA项目里用HIBERNATE调用
 oracle数据库里输出参数类型为整张表对象的游标的存储过程,以下是存储过程和项目里的映射
 -- 查询用户列表的过程
 create or replace procedure proc_userList
 (
   c_user out sys_refcursor
 )
 as
  
 begin
   open c_user for select * from users;
 end;
 
映射文件User.hbm.xml
 <sql-query name="userList" callable="true">
      {call proc_userList(?)}
 <return alias="user" class="entity.User" >

 </return>
     </sql-query>
 
如果我只想查询users表的某些列呢 在存储过程的输出参数返回类型那里要怎么改
 映射文件里又该怎么改呢
 



还有下面是一个添加的存储过程我想把存储过程中的v_str变量转为游标返回然后在项目里HIBERNATE调用
 
怎么实现呢??还有映射文件里要怎么写??--不知道这么想对不对。或者有更简单的方法。
 

-- 添加用户的过程
 create or replace procedure proc_userAdd
 (
   v_yz out sys_refcursor; --定义输出参数类型为游标类型
    v_name varchar2,
    v_password varchar2,
    v_telephone varchar2,
    v_username varchar2,
    v_isadmin char
 )as 
 v_name_check number;
 v_c exception;
 v_str nvarchar2(50);
 begin
   v_name_check=users_cx(v_name);--接收验证用户是否存在的函数返回值 函数在 代码最下面
   if v_name_check>0 then
     raise v_c;
   else  
     insert into users values(seq_user.nextval, v_name, v_password, v_telephone, v_username, v_isadmin);
     v_str:='添加成功';
   end if;
   exception
   when v_c then
   v_str:='添加失败';
   --怎么将v_str转换为游标然后赋给输出参数v_yz呢 
 end;
 
验证用户是否存在的函数
 create or replace function users_cx
 (
 name users.name%type
 )return number as users_count number;
 begin
 select count(*) into users_count from users where name=name;
 return users_count;
 end;

------最佳解决方案--------------------

还是老师给力啊
------其他解决方案--------------------

别沉啊
------其他解决方案--------------------

DOU 几天了 一个回复都没 真纠结
------其他解决方案--------------------
第一个问题:查询定义中把<return>去掉,换成<return-scalar>
<sql-query name="userList" callable="true">
      {call proc_userList(?)}
      <return-scalar column="id" type="java.lang.Integer"/>
      <return-scalar column="name" type="java.lang.String"/>
</sql-query>

<return>默认填充实体的所有属性,如果查询返回的字段不够,就会报“列名无效”异常。
<return-scalar>是单独定义需要返回的结果值,每个值对应一个列。【注意:Query返回的不再是实体对象的集合,而是包含Object[]的集合】


第二个问题:输出参数的值在方法中需要通过查询返回
create or replace procedure proc_userAdd
 (
    v_yz out sys_refcu