diff --git a/jOOQ/src/main/java/org/jooq/ResultQuery.java b/jOOQ/src/main/java/org/jooq/ResultQuery.java index ff19c29b60..7538ce4f6f 100644 --- a/jOOQ/src/main/java/org/jooq/ResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/ResultQuery.java @@ -189,19 +189,6 @@ public interface ResultQuery extends Query, Iterable, Publi @Override Iterator iterator() throws DataAccessException; - /** - * Execute the query using {@link #fetch()} and pass all results to a - * consumer. - *

- * This is essentially the same as {@link #fetch()}. - *

- * {@inheritDoc} - */ - @Override - default void forEach(Consumer action) { - Iterable.super.forEach(action); - } - /** * Execute the query using {@link #fetch()} and return the generated result * as an {@link Spliterator}. diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultQueryTrait.java b/jOOQ/src/main/java/org/jooq/impl/ResultQueryTrait.java index 977ec24b92..5840341c14 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultQueryTrait.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultQueryTrait.java @@ -63,6 +63,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -313,7 +314,21 @@ interface ResultQueryTrait extends QueryPartInternal, ResultQu // [#11895] Don't use the Stream.of(1).flatMap(i -> fetchLazy().stream()) // trick, because flatMap() will consume the entire result set - return fetchLazy().stream(); + AtomicReference> r = new AtomicReference<>(); + + // [#11895] Don't use the Stream.of(1).flatMap(i -> fetchLazy().stream()) + // trick, because flatMap() will consume the entire result set + return StreamSupport.stream( + () -> { + Cursor c = fetchLazy(); + r.set(c); + return c.spliterator(); + }, + Spliterator.IMMUTABLE | Spliterator.NONNULL | Spliterator.ORDERED, + false + ).onClose(() -> { + safeClose(r.get()); + }); } @Override @@ -1398,6 +1413,16 @@ interface ResultQueryTrait extends QueryPartInternal, ResultQu return handler; } + @Override + default void forEach(Consumer action) { + if (fetchIntermediateResult(Tools.configuration(this))) { + fetch().forEach(action); + } + else try (Cursor c = fetchLazy()) { + c.forEach(action); + } + } + @Override default List fetch(RecordMapper mapper) { return collect(mapping(mapper, toList()));