我有一个实体,其中包含了运行的数据 - 日期、距离、持续时间以及一些额外的信息:
@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无法处理。