Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Hibernate JPA n+;1次迭代_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Hibernate JPA n+;1次迭代

Hibernate JPA n+;1次迭代,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我有两个实体,它们没有主键或外键引用,但是我需要一个单向实体来使用或提取关系实体。 使用Spring数据jpa 以下是实体类: @Entity @Table(name="CAR_PARTS") Class CarParts { @id @Column(name="PART_ID") private Long id; @Column(name="PART_NAME") private String partName } @Entity @Table(name="CAR_HISTORY")

我有两个实体,它们没有主键或外键引用,但是我需要一个单向实体来使用或提取关系实体。 使用Spring数据jpa

以下是实体类:

@Entity
@Table(name="CAR_PARTS")
Class  CarParts {

@id
@Column(name="PART_ID")
private Long id;
@Column(name="PART_NAME")
private String partName

}

@Entity
@Table(name="CAR_HISTORY")
Class  CarHistory {

@id
@Column(name="CAR_HIST_ID")
private Long id;

@Column(name="PART_NAME")
private String part;

@ManyToOne(fetch=FetchType.lazy,optional=false)
    @JoinColumn(name="PART_NAME",referencedColumnName="PART_NAME",insertable=false,updatable=false)
    private CarPart carpart;
@column(name="SUBMIT_DATE")
private Date submitedDate;

    }
DAO类:

公共接口CarHistoryDAO扩展了JpaRepository,JpaSpecificationExecutor{ }

服务类别:

  public class CarhistoryServiceImpl {

  @Autowired
  private CarHistoryDAo carHistoryDAO;

  public List<CarHistory> findCarHistory(Date startDate, Date endDate) {
    List<CarHistory> hists = 
     carhistoryDAO.findAll(where(historyBySubmitedDate(startDate,endDate)));
   }
   public static Specification<CarHistory> historyBySubmitedDate(
            final Date startDate, final Date endDate) {
        return new Specification<CarHistory>() {
            @Override
            public Predicate toPredicate(Root<CarHistory> variableRoot,
                    CriteriaQuery<?> q, CriteriaBuilder cb) {

                Predicate p1 = cb.between(
                        variableRoot.<Date> get("submitedDate"),
                        DateUtils.truncate(startDate, Calendar.DAY_OF_MONTH),
                        DateUtils.ceiling(endDate, Calendar.DAY_OF_MONTH));

                return cb.and(p1);
            }
    };
}
公共类CarhistoryServiceImpl{
@自动连线
私家车;
公共列表findCarHistory(日期开始日期、日期结束日期){
列表历史=
carhistoryDAO.findAll(其中(historyBySubmitedDate(startDate,endDate));
}
公共静态规范历史记录BySubmitedDate(
最终日期开始日期,最终日期结束日期){
返回新规范(){
@凌驾
公共谓词toPredicate(根变量Root,
CriteriaQuery q、CriteriaBuilder cb){
谓词p1=cb(
variableRoot.get(“提交日期”),
DateUtils.truncate(开始日期、日历、每月的第天),
DateUtils.天花板(结束日期、日历、月日);
返回cb和(p1);
}
};
}
根据上述关系,当获取CarHistory实体时,我将获得Carpart实体的n+1迭代

我使用的是SpringDataJPA,实现为使用SpringDataJPA中的规范。 是否有任何方法可以避免n+1迭代问题。
我尝试使用onetoone而不是manytoone

来避免
n+1
问题您必须获取
CarPart
实例以及
CarHistory
实体。有多种解决方案:

  • 映射
    CarHistory.carPart
    EAGER
    (不是一个好的解决方案)

  • 编写自定义查询并急切地获取
    CarHistory.carPart
    ,例如从CarHistory ch JOIN fetch ch.carPart where…


  • 这篇文章解释了如何使用

    哪个存储库方法进行检索?或者它是自定义的。请添加更新dao和服务的内容