避免在QueryDSL,Hibernate和Spring Data JPA中加载Lazy Collections

时间:2016-02-16 09:32:35

标签: hibernate jpa spring-data-jpa querydsl

当我使用QueryDSL运行查询时,我想避免加载一些惰性集合。

@Entity
@Table(name = "employee")
public class Employee implements Serializable {

    @Id
    @Column(name = "id", nullable = false)
    @NotNull
    private String id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "employee")
    @Fetch(FetchMode.JOIN)
    @JsonManagedReference
    private Set<Department> departments = new HashSet<Department>();

    @JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "employee")
    @Fetch(FetchMode.JOIN)
    private Set<Location> locations= new HashSet<Locations>();
}

现在,如果我使用以下查询

final QEmployee employee = QEvent.employee;

final List<Employee> employees = query.from(employee)
        .distinct()
        .leftJoin(event.departments).fetch()
        .list();

现在,Department表正确连接后会发生什么,但它正在为Location进行N + 1选择。我正在使用上述查询的结果来构建DTO,因此JSON不会被触发。在逻辑上,我没有访问位置,仍然是所有位置+其下的所有树都是懒惰地获取的。如何防止使用QueryDSL获取位置。

1 个答案:

答案 0 :(得分:1)

问题是位置顶部的@Fetch(FetchMode.JOIN)注释。我删除了它,它的工作正常。现在没有获取地点。