我遇到错误
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();
如果我使用相同的方法,但是程序具有单独的输出,则一切都很好。但是我在游标上遇到了这个异常。
答案 0 :(得分:1)
您必须删除query.execute();
从您的代码;
使用REF_CURSOR
并获取数据时,必须使用query.getSingleResult()
或query.getResultList();
如果有输出参数,则必须在此行之后对其进行访问。
不使用query.execute()
时使用query.executeUpdate()
或resultSet
。