JPA n + 1次迭代

时间:2017-05-30 12:46:29

标签: hibernate jpa spring-data-jpa

我有两个没有主键或外键引用的实体,但我需要有单向实体来使用或提取关系实体。 使用Spring Data 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班级:

public interface 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);
            }
    };
}

与上述关系,当获取CarHistory实体时,我正在为Carpart实体进行n + 1次迭代,

我正在使用Spring数据jpa,实现了在spring数据jpa中使用规范。 有什么方法可以避免n + 1迭代问题。 我尝试使用onetoone而不是manytoone

1 个答案:

答案 0 :(得分:0)

要避免n+1问题,您必须与CarPart实体一起获取CarHistory个实例。有多种解决方案:

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

  2. 撰写自定义查询并热切地提取CarHistory.carPart,例如from CarHistory ch JOIN FETCH ch.carPart where ...

  3. 以下是解释CodeProject

    的文章