У меня есть сущность Mission
, у которой есть коллекция сущностей Trip
, и я хотел бы иметь возможность отсортировать миссию по функциям содержимого в коллекции Trip
.
Сущность Trip
:
@Entity
public Class Trip {
@Id private Long id;
@Column private LocalDateTime time;
}
Сущность Mission
:
@Entity
public Class Mission {
@Id private Long id;
@Column private String city;
@OneToMany(mappedBy = "mission")
private Collection<Trip> trips;
}
Хранилище Mission
:
@Repository
public interface MissionRepository extends PagingAndSortingRepository<Mission, Long>, QuerydslPredicateExecutor<Mission>, QuerydslBinderCustomizer<QMission> {
@Override
default void customize(final QuerydslBindings bindings, final QMission mission) {
bindings.bind(String.class).first((final StringPath path, final String value) -> path.containsIgnoreCase(value));
bindings.including(mission.city);
bindings.excludeUnlistedProperties(true);
}
Page<T> findAll(Predicate predicate, Pageable pageable);
}
Mission
Сервис:
@Service
@Transactional
public class MissionService {
private final MissionRepository missionRepository;
@Autowired
public MissionService(final MissionRepository missionRepository) {
this.missionRepository = missionRepository;
}
public Page<Mission> findAll(final Predicate predicate, final Pageable pageable) {
return this.missionRepository.findAll(predicate, pageable);
}
}
Контроллер Mission
:
@RestController
@RequestMapping("/api/missions")
public class MissionController {
private final MissionService missionService;
@Autowired
public MissionController(final MissionService missionService) {
this.missionService = missionService;
}
@GetMapping
@ResponseBody
public Page<Mission> getAllMissions(@QuerydslPredicate(root = Mission.class) final Predicate predicate, @PageableDefault final Pageable pageable) {
return this.missionService.findAll(predicate, pageable);
}
}
При вызове /api/missions?sort=city,DESC
он работает отлично.Но при звонке /api/missions?sort=trips.time,DESC
я получаю дубликаты записей, которые соответствуют количеству поездок, связанных с миссией.Все эти миссии правильно отсортированы, но повторяющаяся часть просто не нужна ...
Цель состоит в том, чтобы иметь возможность сортировать Mission
(ASC
или DESC
) в зависимости от даты отъездаиз коллекции Trip
(которая будет первой Trip
, отсортированной в ASC
).
Итак, как отсортировать этот список Mission
для содержимого из коллекции Trip
безполучить дублирующую часть?
Я также хотел бы по возможности избежать изменения сигнатуры метода REST или структуры базы данных.
Я думал о добавлении DISTINCT
в список, ноЭто не сработает, поскольку сортировка должна выполняться в поле времени первой поездки.Сортировка в режиме ASC
будет работать.Но в DESC
он будет отсортирован в зависимости от даты прибытия, а не отбытия…
Сумасшедшая идея: можно ли будет автоматически заполнить переходное свойство в миссии содержимымзапрос и сортировка по нему с использованием класса Pageable
?