首页 > 解决方案 > 使用 Spring Pageable 对动态计算的值进行排序

问题描述

我有以下实体:

@Entity
@Table(name = "events")
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private OffsetDateTime startTime;
    private OffsetDateTime endTime;
    private Long duration;
    
    public void setDuration() {
        if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) {
            duration = Duration.between(startTime, endTime).toSeconds();
        }
    }
}

它代表系统中可能持续一段时间的某些事件。创建新实体时,startTime设置为OffsetDateTime.now()duration属性在事件完成并设置时endTime设置。

Event获取实体时,动态duration计算为Duration.between(startTime, OffsetDateTime.now()).toSeconds().

我正在尝试使用和对象来获取Event实体,以便轻松地对对象进行排序:SpecificationPageable

eventRepository.findAll(Specification, Pageable)

duration可以想象,对于未完成的事件(如DB 中设置为) ,排序不起作用null。在从数据库中获取属性时,是否有可能以某种方式设置属性的默认值?

标签: springhibernatejpaspring-data-jpaspring-data

解决方案


如果需要,您可以添加一个@Formula("coalesce(duration, 0)") int durationForSort;字段并按此排序。


推荐阅读