【问题标题】:Session/EntityManager Closed when using StoredProcedureQuerySession/EntityManager 在使用 StoredProcedureQuery 时关闭
【发布时间】:2019-04-30 21:52:31
【问题描述】:

我遇到了一个错误

IllegalStateException: Session/EntityManager 已关闭

StoredProcedureQuery 与Oracle 存储过程和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

【问题讨论】:

    标签: java spring hibernate spring-boot jpa


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2013-11-19
      • 2021-01-26
      • 2019-02-22
      • 2012-12-24
      • 2013-07-04
      相关资源
      最近更新 更多