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

问题描述 投票:2回答:2

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

CAR ---- <OWNERS

我想执行查询,返回所有汽车并提取其所有的业主,这些业主是懒惰地映射的。换句话说,我想获取那些在事务之外使用的东西。

我的查询如下:

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

我使用的是带有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);            
spring-boot jpql spring-data-rest querydsl
2个回答
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();

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.