Java 带in子句的多对一N+1问题
我有两个具有单向关系的实体,多对一如下:Java 带in子句的多对一N+1问题,java,jpa,criteria,eager-loading,many-to-one,Java,Jpa,Criteria,Eager Loading,Many To One,我有两个具有单向关系的实体,多对一如下: class CarMaster { // some properties @Column(name = "CAR_ID") private Long carId; } class CampaignMapping { // other properties @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @Joi
class CarMaster {
// some properties
@Column(name = "CAR_ID")
private Long carId;
}
class CampaignMapping {
// other properties
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "CAR_ID", referencedColumnName = "CAR_ID")
private CarMaster carMaster;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "CONTRACT_ID", referencedColumnName = "CONTRACT_ID")
private ContractMaster contractMaster;
}
我在下面的查询中搜索与汽车ID列表匹配的活动映射
@Override
public List<CampaignMapping> findByCarMasterCarId(final Long carIds) {
final CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
final CriteriaQuery<CampaignMapping> criteriaQuery = criteriaBuilder
.createQuery(CampaignMapping.class);
final Root<CampaignMapping> campaignMappingRoot = criteriaQuery
.from(CampaignMapping.class);
// below line didn't help
//campaignMappingRoot.fetch("carMaster");
campaignMappingRoot.fetch("contractMaster");
criteriaQuery.select(CampaignMappingRoot);
// I guess issue is with this line
// causing N queries
criteriaQuery.where(criteriaBuilder.equal(
campaignMappingRoot.get("carMaster").get("carId"),
carIds));
return this.entityManager.createQuery(criteriaQuery).getResultList();
}
我希望在一个带有in子句的查询中得到结果。我检查了hibernate日志,它正在打印一个select查询,其中IN子句包含所有id,select查询针对列表中的每个车辆id,条件为equals。我尝试了FetchType.EAGER和campaignMappingRoot.fetchcarMaster;但触发的查询数量仍然相同。
请建议如何仅使用CriteriaBuilder查询获得没有N+1问题的结果。试试这个@DinarZaripov,非常感谢。我更喜欢用CriteriaBuilder寻找解决方案。此外,我还编辑了我的问题。向一个缺少的实体添加了一个或多个。为什么不在没有CriteriaBuilder的情况下进行尝试