2016-10-19 11 views
1

У меня есть эти JPA сущности (упрощенных):Заказав ответ JPA Repository по первому элементу в ссылочном Entity

@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

Вы можете изменить свой метод findByTravelerName сделать что

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

Сэм Джонс обновил ответ с запросом, но сначала попробуйте его или попробуйте преобразовать его в sql –

0

Вы можете попробовать подзапрос, чтобы найти минимальную departurDate для поездки, а затем использовать его в качестве фильтра на trip.tripLegs

Что-то вроде

«SELECT DISTINCT FROM поездки Trip трип СЛЕВА РЕГИСТРИРУЙТЕСЬ trip.tripLegs ноги ГДЕ legs.departureDate = (SELECT Min (l.departureDate) ОТ TripLeg л WHEREl.trip = поездку) ORDER BY legs.departureDate»

0

Кто-то я был discu Сказав это, заметила ослепительно очевидную возможность - просто взгляните. Вот что я в итоге сделал. У меня было туннельное видение, слишком сильно фокусирующееся на решении JPA, что я не видел альтернативы, которая имела смысл.