Spring Data JPA计算字段排序

3

我有一个实体,其中包含了运行的数据 - 日期、距离、持续时间以及一些额外的信息:

@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投影,其中包含weekNo,距离总和和持续时间总和:
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计算周开始/结束和基于距离总和和持续时间总和的平均速度)。

但是,我想使用pageable中的sort按平均速度或按周开始或周结束日期排序。这些字段是计算出来的,因此当我尝试传递它们时会出现异常。该如何解决?我希望用户使用AverageWeekRun类中的字段名称,但其中一些是计算出来的,Spring Data JPA无法处理。

1个回答

0

您可以使用:

Sort sort = Sort.by(Sort.Direction.DESC, "sumOfDistance");
Pageable pageable = PageRequest.of(page, limit, sort);

我已经使用它,只要您的计算值带有"as somename",这将起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接