У меня есть объект, который содержит данные о пробеге - дату, расстояние, продолжительность и некоторые дополнительные:
@Entity
class RunEntry {
private Long id;
private LocalDate date;
private int weekNo;
private Long distance;
private Duration duration;
private Long userId;
// getters, setters
}
На основе этих данных я должен создать отчет, который будет содержать расстояние за неделю и средняя скорость (поэтому я добавил столбец weekNo, чтобы легко группировать по):
class AverageWeekRun {
private LocalDate weekStart;
private LocalDate weekEnd;
private BigDecimal averageSpeed;
private Long distance;
// getters, setters
}
Для этого я создаю проекцию Spring Data JPA, которая содержит номер недели, сумму расстояния и сумму продолжительности:
interface RunPerWeek {
int getWeekNo();
Long getSumOfDistance();
Long getSumOfDuration();
}
, и я создал простой метод в репозитории:
@Query("select r.weekNo as weekNo, sum(r.distance) as sumOfDistance, sum(r.duration) as sumOfDuration "
+ "from RunEntry r where r.userId = :userId group by r.weekNo")
Page<RunPerWeek> findRunPerWeekForUser(Long userId, Pageable pageable)
Он отлично работает, я могу использовать этот результат запроса и сопоставить его с AverageWeekRun (вычисляя начало / конец недели на основе weekNo и средняя скорость на основе суммы расстояния и продолжительности).
Однако я хочу использовать сортировку от страницы к порядку по средней скорости или по дате начала или конца недели. Эти поля вычисляются, поэтому я получаю исключение, когда пытаюсь передать его с помощью sort. Как это решить? Я хочу, чтобы пользователь использовал имена полей из класса AverageWeekRun, но некоторые из них вычисляются, и Spring Data JPA не может с этим справиться.