使用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);
答案 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)