使用 hibernate-ResultSet Return 调用 Oracle Procedure 只有第一行数据 remaing rows data missing

Calling Oracle Procedure using hibernate- ResultSet Return only first row data remaing rows data missing

当我从休眠状态调用存储过程时。结果集 returns 只有一行,但在数据库中 table 有四行数据。

这里我附上了 table 的详细信息和来自数据库的数据。

Table 姓名 : TBL_EMPLOYEES

**Procedure :**

create or replace PROCEDURE  "SP_GET_EMPLOYEES" (
    ecur OUT sys_refcursor)
AS
BEGIN
  OPEN ecur FOR
  SELECT *FROM TBL_EMPLOYEES;
END;

Java代码(在Hibernate中调用Oracle存储过程)

Session session = HibernateSessionManager.getSessionFactory()
                .openSession();

        session.beginTransaction();
    try {
        session.doWork(new Work() {
              public void execute(Connection connection) {

                CallableStatement call;
                try {
                    String aProcedureName="SP_GET_EMPLOYEES";
                    String functionCall = "{call " + aProcedureName + "(?)}"; 
                    call = connection.prepareCall( functionCall ); 

                    call.registerOutParameter(1, OracleTypes.CURSOR );
                    call.execute();

                     ResultSet rs=(ResultSet) call.getObject(1);
                     if(rs.next()){
                        System.out.println(rs.getString(1));
                     }


                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // propagate this back to enclosing class
              }
            });

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.getTransaction().commit();
    }

o/p: 苏里亚

请帮我解决这个问题。或任何其他从休眠状态到 oracle 存储过程的方法。

在此处更改您的代码:

旧:

 if(rs.next()){
     System.out.println(rs.getString(1));
 }

新:

 while(rs.next()){
     System.out.println(rs.getString(1));
 }

这是因为你没有做循环,所以你只是第一次检查条件。

您只能获得单条记录

使用

     ResultSet rs =    call.getResultSet();
     while(rs.next())
     {
        sysout(rs.getString(1));
      }

而您实际上只检索了一条记录。

感谢您提供代码。

我做了一些小改动,它工作正常。

程序脚本:

create or replace PROCEDURE  GET_EMPLOYEES_1 (
    ecur OUT sys_refcursor)
AS
BEGIN
  OPEN ecur FOR
  SELECT * FROM EMPLOYEE;
END;

休眠:

Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();
    try {
        session.doWork(new Work() {
            public void execute(Connection connection) {

                CallableStatement call;
                try {
                    String aProcedureName = "GET_EMPLOYEES_1";
                    String functionCall = "{call " + aProcedureName + "(?)}";
                    call = connection.prepareCall(functionCall);

                    call.registerOutParameter(1, OracleTypesHelper.INSTANCE.getOracleCursorTypeSqlType());
                    call.execute();

                    ResultSet rs = (ResultSet) call.getObject(1);
                    if (rs.next()) {
                        logger.info("ID:" + rs.getString(1));
                        logger.info("status" + rs.getString(3));
                        logger.info("Location" + rs.getString(4));
                        logger.info("First name" + rs.getString(5));
                        logger.info("Last name" + rs.getString(6));
                    }

                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // propagate this back to enclosing class
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.getTransaction().commit();
    }