使用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);
多次尝试后我找到了解决方案,这里是代码:
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();
我有同样的问题,我不得不将new JPAQuery(em)
改为new JPAQuery<Foo>(em)