我有两个没有主键或外键引用的实体,但我需要有单向实体来使用或提取关系实体。 使用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
答案 0 :(得分:0)
要避免n+1
问题,您必须与CarPart
实体一起获取CarHistory
个实例。有多种解决方案:
将CarHistory.carPart
映射为EAGER
(不是一个好的解决方案)
撰写自定义查询并热切地提取CarHistory.carPart
,例如from CarHistory ch JOIN FETCH ch.carPart where ...
以下是解释CodeProject
的文章