У меня есть код, использующий 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
Спасибо за любые идеи!