原代码如下:
@Test
public void dm_cursor_test() throws Exception {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("PAC_DM_TEST.DM_LIST");
// query.registerStoredProcedureParameter(1, DmdbType.class, ParameterMode.REF_CURSOR);
query.registerStoredProcedureParameter(1, Void.class, ParameterMode.REF_CURSOR);
query.execute();
//query.executeUpdate();
List resultList = query.getResultList();
log.info("resultList == {}", resultList);
}
执行报错:java.lang.IllegalStateException: Session/EntityManager is closed;
经过查阅资料发现,当createquery之后,只能执行一次查询,如果在执行第二次查询后需要重新createquery。
把代码修改为如下:
@Test
public void dm_cursor_test() throws Exception {
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("PAC_DM_TEST.DM_LIST");
// query.registerStoredProcedureParameter(1, DmdbType.class, ParameterMode.REF_CURSOR);
query.registerStoredProcedureParameter(1, Void.class, ParameterMode.REF_CURSOR);
//query.execute();
//query.executeUpdate();
List resultList = query.getResultList();
log.info("resultList == {}", resultList);
}
直接注释代码query.execute();解决该问题,因为调用存储过程返回游标时不需要执行query.execute();在调用普通存储过程时需要执行query.execute();这也是经过多番测试才发现的规律。
文章
阅读量
获赞