Hibernate ScrollableResults: почему закрывается набор результатов? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть код, использующий JPA2, предоставленный Hibernate.

В коде я создаю запрос, получаю запрос hibernate, а затем вызываю .scroll (), чтобы получить ScrollableResults.

Затем я начинаю перебирать прокручиваемые результаты и выдаю еще один запрос для получения дополнительных данных.

На этом этапе прокручиваемые результаты неожиданно закрываются, и выдается исключение. Я думаю, что это изменение было внесено при обновлении до Hibernate 5.4.18, потому что я всегда делал это с Hibernate 5.1.0.

Вот пример. Это не мой реальный код, так как нет смысла перезагружать объект Group, когда он уже доступен из объекта User. Однако это демонстрирует проблему, поскольку это приводит к исключению. Если я закомментирую внутренний запрос, функция завершится нормально.

public static void main(String[] args) {
    EntityManager em = getEntityManager();
    
    // Create a query to read all the users from the database
    Query qUser = em.createQuery("SELECT row FROM User row");
    qUser.setMaxResults(10);

    // Create a second query to obtain the additional information about a user
    Query qGroup = em.createQuery("SELECT row FROM Group row WHERE id=:groupId");

    
    // Get the hibernate query
    org.hibernate.query.Query hibernateQuery = qUser.unwrap(org.hibernate.query.Query.class);
    hibernateQuery.setReadOnly(true);
    
    // Obtain a ScrollableResults object for the User query
    ScrollableResults sr = hibernateQuery.scroll();
    
    while(sr.next())
    {
        // Get the user object for this row
        User user = (User)sr.get(0);

        // Get the id of the user's group
        Integer id = user.getUserGroup().getId();
        
        // Read the user group using a query
        qGroup.setParameter("groupId",  id);
        // Comment this out to avoid the exception
        Group g = (Group)qGroup.getSingleResult();
    }
    releaseEntityManager(em);
}       

Результирующее исключение:

Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not advance using next()
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.internal.ScrollableResultsImpl.convert(ScrollableResultsImpl.java:70)
    at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:105)
    at com.jamie.Tester.main(Tester.java:29)
Caused by: java.sql.SQLException: You can't operate on a closed ResultSet!!!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:691)
    at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:100)
    ... 1 more
Caused by: java.lang.NullPointerException
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:685)
    ... 2 more

Спасибо за любые идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...