【问题标题】:JPA n+1 iterationJPA n+1 迭代
【发布时间】:2017-10-30 22:56:33
【问题描述】:

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

公共接口 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 data jpa,实现为在 spring data jpa 中使用规范。 有什么办法可以避免 n+1 迭代问题。 我尝试使用 onetoone 而不是 manytoone

【问题讨论】:

  • 您使用哪种存储库方法进行检索?还是习惯。请补充一下
  • 更新了 dao 和服务

标签: hibernate jpa spring-data-jpa


【解决方案1】:

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

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

  2. 编写自定义查询并急切地获取CarHistory.carPart,例如from CarHistory ch JOIN FETCH ch.carPart where ...

这里是解释to initialize lazy associations and when to use them的文章

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 2014-06-11
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2021-07-04
    相关资源
    最近更新 更多