Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带in子句的多对一N+1问题_Java_Jpa_Criteria_Eager Loading_Many To One - Fatal编程技术网

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的情况下进行尝试