2017-05-30 48 views
0

我有兩個沒有主鍵或外鍵引用的實體,但我需要有使用或提取關係實體的單向實體。 使用Spring Data jpa。JPA n + 1迭代

下面

是實體類:

@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); 
      } 
    }; 
} 

與上述關係,何時取C arHistory實體我得到n + 1迭代的Carpart實體,

我正在使用Spring數據jpa,實現使用spring數據jpa中的規範。 有什麼辦法可以避免n + 1迭代問題。 我onetoone而不是多對一

+1

該庫的方法您使用的檢索解釋?或者是定製的。請加 –

+0

更新道和服務 –

回答

0

試圖避免n+1問題,你必須與CarHistory實體一起取CarPart實例。有多種解決方案:

  1. 地圖CarHistory.carPartEAGER(不是一個很好的解決方案)

  2. 編寫自定義查詢並獲取CarHistory.carPart熱切,例如from CarHistory ch JOIN FETCH ch.carPart where ...

下面是文章如何to initialize lazy associations and when to use them