现在做的项目要hibernate+struts2 要用到存储过程取值,用hibernate怎么调用有两个返回值的存储过程 请高手指教给点提示

解决方案 »

  1.   

    hibernate中可以调用jdbc,jdbc中可以这么写:? = call fuctionName(?,?,?)没见过有两个返回值的应该是输出的两个值吧!
      

  2.   

    Session session =HibernateSessionFactory.getSession();    
    Connection conn = session.connection();    
    ResultSet rs =null;   
    CallableStatement call = conn.prepareCall("{Call proc(?,?,?)}");  
    call.setString(0,"abc");
    call.registerOutParameter(1, Types.VARCHAR);
    call.registerOutParameter(2,Types.VARCHAR);
    rs = call.executeQuery();   
    if(rs.next()){
    System.out.println("存储过程得到的第一个返回值是:"+rs.getString(1));
    System.out.println("存储过程得到的第二个返回值是:"+rs.getString(2));
    }
      

  3.   


    Session session = HibernateSessionFactory.getSession();
    Connection con = null;
    CallableStatement cstmt = null;
    ResultSet rs= null;
    Transaction tr = null;
    String backValue ="";
    String backStr;
    try{
    tr = session.beginTransaction();
    con = session.connection();
    try {
    cstmt = con.prepareCall(" call ${SHOP88.Sp_aj001_iu(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
    cstmt.registerOutParameter(1, Types.NUMERIC);
    cstmt.registerOutParameter(2, Types.VARCHAR);
    cstmt.setBigDecimal(3, orderNum);
    cstmt.setBigDecimal(4, customId);
    cstmt.setDouble(5, allPrice);
    cstmt.setDouble(6,ACCTF_SEND_SCHD_AMT);
    cstmt.setString(7, "CD1");
    cstmt.setString(8, "ITV");
    cstmt.setDouble(9, CARD_APPR_AMT);
    cstmt.setDouble(10,ACCM_APPLY_AMT);
    cstmt.setDouble(11, CRDT_APPLY_AMT);
    cstmt.setDouble(12, PCARD_APPLY_AMT);
    cstmt.setString(13, "ITV");
    rs = cstmt.executeQuery();
    if(rs.next()){
    System.out.println("存储过程得到的第一个返回值是:"+rs.getString(1));
    System.out.println("存储过程得到的第二个返回值是:"+rs.getString(2));
    }
    //backValue = cstmt.getString(1);
    //backStr = cstmt.getString(2);
    // System.out.println(cstmt.getString(1)+"====");
    // if(backValue.equals(0) ){
    // System.out.println("正常");
    // return true;
    // }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }catch(HibernateException e){

    }
    这个报错 是什么情况啊Exception in thread "main" java.lang.NullPointerException
    at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:870)
    at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:957)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
    at com.tuge.iptv.order.dao.impl.OrderGoodsDAOImpl.orderStatus(OrderGoodsDAOImpl.java:117)
    at com.tuge.iptv.util.Test.main(Test.java:66)
      

  4.   


    Sp_aj001_iu (
    an_rtn_code    OUT NUMBER,   --返回代码,负数说明有错误
    av_rtn_msg     OUT VARCHAR2,  --返回信息
    an_ORD_ID     IN     tb_aj001.ord_id%TYPE, 
    an_CUST_ID               IN     tb_aj001.cust_id%TYPE,         
       an_TOT_ORD_AMT           IN     tb_aj001.tot_ord_amt%TYPE,     
       an_acctf_send_schd_amt   IN     tb_aj001.acctf_send_amt%TYPE,  
       av_SEND_BANK_CD          IN     tb_aj001.send_bank_cd%TYPE,    
       av_SENDER                IN     tb_aj001.sender%TYPE,          
       an_CARD_APPR_AMT         IN     tb_aj001.card_appr_amt%TYPE, 
       an_ACCM_APPLY_AMT        IN     tb_aj001.accm_apply_amt%TYPE,  
       an_CRDT_APPLY_AMT        IN     tb_aj001.crdt_apply_amt%TYPE, 
       an_PCARD_APPLY_AMT       IN     tb_aj001.pcard_apply_amt%TYPE, 
       av_etr_id                IN     VARCHAR2                          
       )
    存储过程
      

  5.   

    个人建议不要用hibernate调存储过程,Hibernate的优势是O-R映射和DML操作
      

  6.   

    项目现在用的是Hibernate 再写个jdbc来调用?
      

  7.   

    你那个错是空指针,debug会吗?看哪个对象为空
      

  8.   

    是call ${SHOP88.Sp_aj001_iu(?,?,?,?,?,?,?,?,?,?,?,?,?) 写错了 多了个$