使用StoredProcedureQuery

时间:2019-04-30 21:52:31

标签: java spring hibernate spring-boot jpa

我遇到错误

  

IllegalStateException:会话/ EntityManager已关闭

在Oracle存储过程和StoredProcedureQuery中使用SYS_REFCURSOR时。

使用Spring Boot + spring-boot-starter-data-jpa

@Repository
public class HibernateTestingDao implements CommandLineRunner {

...

    /**
     * Conector con la base de datos
     */
    @PersistenceContext
    private EntityManager entityManager;

    /**
     * Properties
     */
    @Autowired
    private CustomYMLFile properties;

    /**
     * Ejecucion automatica
     */
    @Override
    public void run(String... args) throws Exception {

        log.info("Iniciando la Ejecucion");

        procedureSalidaCursor();

        log.info("La ejecucion del proceso ha finalizado");

    }

    /**
     * Salida Cursor
     */
    private void procedureSalidaCursor() {

        log.info("Conectando al procedure : " + properties.getProcedureSalidaCursor());

        try {


            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date fechaQuery = new java.sql.Date(df.parse("2017-07-17").getTime());

            StoredProcedureQuery query = entityManager
                    /*
                     * Procedure a llamar
                     */
                    .createStoredProcedureQuery(properties.getProcedureSalidaCursor())
                    /*
                     * Entradas
                     */
                    .registerStoredProcedureParameter(1, Date.class, ParameterMode.IN)
                    .registerStoredProcedureParameter(2, String.class, ParameterMode.IN)
                    /*
                     * Salidas
                     */
                    .registerStoredProcedureParameter(3, void.class, ParameterMode.REF_CURSOR)

                    /*
                     * Parametros de entrada
                     */
                    .setParameter(1, fechaQuery) // FECHA
                    .setParameter(2, "77647538"); // RUT

            log.info("Ejecutando Procedure");
            query.execute();
            log.info("Procedure Ejecutado");

            List<Object[]> results = query.getResultList();

            log.info("Parametros obtenidos correctamente");

        } catch (Exception e) {
            log.error("Error al consultar BD , Detalle > ", e);
        }
    }
    ....
  }

执行此操作时出现异常:

List<Object[]> results = query.getResultList();

如果我使用相同的方法,但是程序具有单独的输出,则一切都很好。但是我在游标上遇到了这个异常。

github项目:https://github.com/betray32/HibernateSpring

1 个答案:

答案 0 :(得分:1)

您必须删除query.execute(); 从您的代码; 使用REF_CURSOR并获取数据时,必须使用query.getSingleResult()query.getResultList(); 如果有输出参数,则必须在此行之后对其进行访问。 不使用query.execute()时使用query.executeUpdate()resultSet