如何在QueryDSL 4中获取延迟集合

时间:2018-05-15 10:22:47

标签: spring-boot jpql spring-data-rest querydsl

使用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,这意味着&#39;所有者&#39;没有正确获取。你能否解释一下如何解决这个问题?

例如,当我手动编写此查询时,它可以正常工作:

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

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

BTW,查询在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 :(得分:2)

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

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

答案 1 :(得分:0)

我遇到了同样的问题,不得不将new JPAQuery(em)更改为new JPAQuery<Foo>(em)