当我使用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获取位置。
答案 0 :(得分:1)
问题是位置顶部的@Fetch(FetchMode.JOIN)
注释。我删除了它,它的工作正常。现在没有获取地点。