от
На этот вопрос уже есть ответ здесь: Ява.утиль.трансляция с ResultSet 4 ответы Чтобы наилучшим образом использовать java8 Stream и Spring4, я использовать API поток следующим образом на объект ResultSet JDBC, который исходит от jsdbRestTemplate пружин (код сокращен и упрощен):
public  T consumeResultStream(
    String query, 
    Function, T> extractorFunction
) {
    return jdbcTemplate.query(
        query, 
        resultSet 

Это, кажется, работает нормально. Клиенты могут использовать поток API, таких как этот, не беспокоясь о классах с JDBC 

List myResult = consumeResultStream("SELECT ...", stream 

Однако, когда я рефакторинг (пытаемся предоставить вместо потока методы клиента), такой:

    final Stream stream = 
        jdbcTemplate.query(query, resultSet 

Я вам 

org.springframework.jdbc.InvalidResultSetAccessException: 
  The object is already closed [90007

Так что похоже, данные могут быть прочитаны только в методе jdbcTemplate.query()
. Есть ли чистый способ я могу обойти это и вернуть ленивый поток, эти элементы из БД? Предположим, материализуя результат и трансляция, Что это не вариант из-за размера результатов (хотя нумерация страниц может быть лучше образца).

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
JdbcTemplate
не обрабатывает транзакции за его вызов, вопреки весне
JPA
. Не допускать подключения к БД закрыт, открывать сделки со стороны клиента, которое управляет вернулся ленивый результат. Аннотирование он с
@Transactional
обычно достаточно :
@Transactional
public void findLazyData(){
   Stream
...