Сортировка Spring Data JPA по вычисляемым полям - PullRequest
1 голос
/ 28 мая 2020

У меня есть объект, который содержит данные о пробеге - дату, расстояние, продолжительность и некоторые дополнительные:

@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 не может с этим справиться.

...