【问题标题】:How to fetch lazy collection in QueryDSL 4如何在 QueryDSL 4 中获取惰性集合
【发布时间】:2018-10-25 03:31:25
【问题描述】:

我在使用 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();

类似的查询在 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我不得不将new JPAQuery(em) 更改为new JPAQuery&lt;Foo&gt;(em)

      【讨论】:

        猜你喜欢
        • 2021-02-08
        • 1970-01-01
        • 2016-04-08
        • 2017-11-25
        • 2018-01-22
        • 2017-02-05
        • 1970-01-01
        • 2014-05-29
        • 2018-05-13
        相关资源
        最近更新 更多