2016-10-19 88 views
1

第一項的JPA庫響應我的這些JPA實體(簡體):訂購中引用的實體

@Entity 
class Trip { 
    @Id 
    Long tripId; 

    String travelerName; 

    @OneToMany 
    List<TripLeg> tripLegs; 
} 

@Entity 
class TripLeg { 
    @Id 
    Long tripLegId; 

    Calendar departureDate; 

    @ManyToOne 
    Trip trip; 
} 

和這個倉庫:

interface TripRepository extends JpaRepository<Trip, Long> { 
    Page<Trip> findByTravelerName(String travelerName, Pageable pageable); 
} 

有什麼辦法那種旅行的腿之間的最早出發日期的頁面響應?通過查詢方法或JPQL,或者在Pageable的排序屬性中?

因此,舉例來說,此行:

{ 
    id : 1, 
    travelerName : "John Doe", 
    tripLegs : [{ 
     id : 3, 
     departureDate : 2015-10-03 
    }] 
} 

將排序後的這一個:

{ 
    id : 2, 
    travelerName : "John Doe", 
    tripLegs : [{ 
      id : 1, 
      departureDate : 2015-10-01 
     }, { 
      id : 2, 
      departureDate : 2015-10-05 
    }] 
} 

回答

0

您可以通過修改find​​ByTravelerName方法,這樣做

Page<Trip> findByTravelerNameOrderByTripLegsDepartureDateAsc(String travelerName, Pageable pageable); 

或者試試這個查詢

SELECT trip FROM Trip as trip join trip.tripLegs as tleg group by tleg.trip_id order by tleg.departureDate ASC 
+0

在每個TripLeg-IE的頁面中添加重複記錄,結果頁面從2次行程變爲3次(每次TripLeg排序一次)。 –

+0

Sam Jones用查詢更新了答案,但請先測試它或嘗試將其轉換爲sql –

0

你可以嘗試一個子查詢找到了一趟最低departurDate,然後使用它作爲一個過濾器上trip.tripLegs

喜歡的東西

從「選擇旅行行程LEFT鮮明之旅JOIN trip.tripLegs腿 WHERE legs.departureDate =(SELECT MIN(l.departureDate)FROM TripLeg升 WHEREl.trip =跳)ORDER BY legs.departureDate」

0

有人我discu對此進行調查並指出了一個非常明顯的可能性 - 只是看看。這就是我最終做的。我有過分關注JPA解決方案的隧道洞察力,我沒有看到有意義的替代方案。