如何在 QueryDSL 4 中获取惰性集合

Mic*_*wka 2 jpql querydsl spring-data-rest spring-boot

我在使用 querydsl 执行非常简单的查询时遇到以下问题。想象一下,我们有两个实体:

汽车----<车主

我想执行查询,该查询返回所有汽车并获取延迟映射的所有所有者。换句话说,我想获取那些在交易之外使用的东西。

我的查询看起来像:

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();
Run Code Online (Sandbox Code Playgroud)

类似的查询在 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();
Run Code Online (Sandbox Code Playgroud)

我正在使用带有 querydsl 4.1.4 的 spring-boot 2

顺便说一句,查询在 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);            
Run Code Online (Sandbox Code Playgroud)

Mic*_*wka 5

经过多次尝试,我找到了解决方案,这是代码:

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();
Run Code Online (Sandbox Code Playgroud)