jpa-streamer
jpa-streamer copied to clipboard
OneToManyDemo: Scroll and collection restrictions
Reproduce: Run OneToManyDemo:
Works:
Map<Language, Set<Film>> languageFilmMap = jpaStreamer.stream(Language.class)
.limit(10)
.collect(
toMap(Function.identity(),
Language::getFilms)
);
Fails:
Map<Language, Set<Film>> languageFilmMap = jpaStreamer.stream(of(Language.class).joining(Language$.films))
.limit(10)
.collect(
toMap(Function.identity(),
Language::getFilms)
);
This might be a fundamental problem. Joins and skip/limit do not work together. Needs to be handled somehow.
Exception in thread "main" org.hibernate.QueryException: firstResult/maxResults not supported in conjunction with scroll() of a query containing collection fetches
at org.hibernate.engine.query.spi.HQLQueryPlan.performScroll(HQLQueryPlan.java:350)
at org.hibernate.internal.SessionImpl.scroll(SessionImpl.java:1554)
at org.hibernate.query.internal.AbstractProducedQuery.doScroll(AbstractProducedQuery.java:1502)
at org.hibernate.query.internal.AbstractProducedQuery.scroll(AbstractProducedQuery.java:1488)
at org.hibernate.query.internal.AbstractProducedQuery.stream(AbstractProducedQuery.java:1512)
at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.stream(CriteriaQueryTypeQueryAdapter.java:91)
at org.hibernate.query.Query.getResultStream(Query.java:1140)
at com.speedment.jpastreamer.renderer.standard.internal.StandardRenderer.render(StandardRenderer.java:88)
at com.speedment.jpastreamer.builder.standard.internal.StreamBuilder.renderAndThenApply(StreamBuilder.java:361)
at com.speedment.jpastreamer.builder.standard.internal.StreamBuilder.collect(StreamBuilder.java:218)
at com.speedment.jpastreamer.autoclose.standard.internal.AutoClosingStream.lambda$collect$7(AutoClosingStream.java:179)
at com.speedment.jpastreamer.autoclose.standard.internal.AbstractAutoClosingBaseStream.finallyClose(AbstractAutoClosingBaseStream.java:95)
at com.speedment.jpastreamer.autoclose.standard.internal.AutoClosingStream.collect(AutoClosingStream.java:179)
at com.speedment.jpastreamer.demo.OneToManyDemo.main(OneToManyDemo.java:32)
We could add a parameter in the StreamConfiguration
resolveJoinSkipLimit(JoinSkipLimitResolver joinSkipResolver)
FAIL, FAVOR_JOIN, FAVOR_SKIP_LIMIT
This should work by moving the skip to the JVM:
final StreamConfiguration<Film> configuration = StreamConfiguration.of(Film.class).joining(Film$.actors).joining(Film$.language);
jpaStreamer.stream(configuration)
.sorted(Film$.length.reversed())
.limit(10)
.forEach(System.out::println);