我正在尝试获取看起来像这样的实体:
@Entity
public class Product{
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ProductVersion> versions;
}
但我还必须遍历版本,然后通过内部的一些对象:
@Entity
public class ProductVersion{
@ManyToOne
@JoinColumn(name = "PRODUCT_ID", nullable = false)
private Offer offer;
@OneToMany(mappedBy = "productVersion", cascade = CascadeType.ALL)
private Set<Objects> objects;
}
因此我需要有一个查询,可以获取版本中的Eagerly版本和对象(以避免N + 1问题)。不幸的是,因为版本在List中,查询会生成dupplicates(不幸的是它必须是List)。结果看起来有点像这样:
Product1{
version1,
version1,
version1,
version2,
version2,
version2
}
Product2{
version1,
version1,
version1,
version2,
version2,
version2
}
编辑:我当前的查询看起来有点像这样(我正在使用JPAQuery):
QProduct qof = QProduct.product;
QProductVersion qProductVersionAlias = new QProductVersion("qProductVersionAlias ");
JPAQuery query = new JPAQuery(entityManager)
.distinct()
.from(qof)
.join(qof.versions, qProductVersionAlias ).fetch()
.leftJoin(qOfferVersionAlias.objects).fetch();
我已经发现在Criteria Api中你可以像这样解决这个问题:
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
但是我正在寻找JPA解决方案。所以我的问题是如何使用JPA解决这个问题?