jpa-streamer icon indicating copy to clipboard operation
jpa-streamer copied to clipboard

OneToManyDemo: Scroll and collection restrictions

Open minborg opened this issue 5 years ago • 3 comments

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)
                );

minborg avatar Sep 04 '20 09:09 minborg

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)

minborg avatar Sep 04 '20 09:09 minborg

We could add a parameter in the StreamConfiguration

resolveJoinSkipLimit(JoinSkipLimitResolver joinSkipResolver)

FAIL, FAVOR_JOIN, FAVOR_SKIP_LIMIT

minborg avatar Sep 04 '20 10:09 minborg

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);

minborg avatar Sep 16 '20 17:09 minborg