Session/EntityManager 在使用 StoredProcedureQuery 时关闭

我收到一个错误

IllegalStateException:会话/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)


        } catch (Exception e) {

            log.error("Error al consultar BD , Detalle > ", e);

        }

    }

    ....

  }

执行此操作时出现异常:


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

如果我使用相同的方法,但使用具有单独输出的程序,一切都很好。但我用游标得到了这个例外。


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


鸿蒙传说
浏览 398回答 1
1回答

白衣染霜花

您必须query.execute();&nbsp;从您的代码中删除;当使用REF_CURSORand 获取数据时必须使用query.getSingleResult()orquery.getResultList();&nbsp;如果有输出参数,则必须在此行之后访问。使用query.execute()或不使用query.executeUpdate()时。resultSet
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java