Как получить ленивую коллекцию в QueryDSL 4 - PullRequest
0 голосов
/ 15 мая 2018

У меня следующая проблема с выполнением довольно простого запроса с помощью querydsl.Представьте, что у нас есть две сущности:

CAR ----

Я хотел бы выполнить запрос, который возвращает все автомобили и выбирает всех его владельцев, которые сопоставлены лениво.Другими словами, я хотел бы получить те, которые будут использоваться за пределами транзакции.

Мой запрос выглядит так:

List<Car> cars = new JPAQuery<Car>(em)
                    .select(car).from(car)
                    .leftJoin(car.owners, owner)
                    .where(car.make.eq(make))
                    .orderBy(new OrderSpecifier<>(Order.ASC, car.id))
                    .distinct()
                    .fetch();

Аналогичный запрос работал в QueryDSL 3 нормально, но после обновления до 4Я получаю LazyInitializationException, что означает, что «владельцы» не выбираются должным образом.Не могли бы вы пролить свет на то, как решить эту проблему?

Например, когда я пишу этот запрос вручную, он работает совершенно нормально:

List<Car> cars = em.createQuery(
            "SELECT DISTINCT c FROM Car c LEFT JOIN FETCH c.owners WHERE c.make = :make ORDER BY c.id ASC")
            .setParameter("make", make).getResultList();

Я использую spring-boot 2 с querydsl4.1.4

Кстати, запрос, который работал нормально в querydsl 3

List<Car> car = new JPAQuery(em)
                .from(car)
                .leftJoin(car.owners)
                .fetch()
                .distinct()
                .where(car.make.eq(make))
                .orderBy(new OrderSpecifier<>(Order.ASC, car.id))
                .list(car);            

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

У меня была такая же проблема, и мне пришлось изменить new JPAQuery(em) на new JPAQuery<Foo>(em)

0 голосов
/ 15 мая 2018

после нескольких попыток я нашел решение, вот код:

new JPAQuery<Car>(em)
           .select(car)
           .distinct()
           .from(car)
           .leftJoin(car.owners, owner).fetchJoin()
           .where(car.make.eq(make))
           .orderBy(new OrderSpecifier<>(Order.ASC, car.id))
           .fetch();
...