Criteria API 按两个 LocalDateTime 之间的时间排序

Criteria API order by time between two LocalDateTime

给定一个实体,该实体具有两个 LocalDateTime 类型的日期字段:

class MyEntity {

    private LocalDateTime start;
    private LocalDateTime lastUpdate;

}

我想编写一个带有条件 api 的查询,按这两个日期之间的时间对结果集进行排序。

/* ... */
Root<MyEntity> root = query.from(MyEntity.class);
Order order = ???
root.orderBy(cb.desc(order));
/* ... */

我目前的想法:

p.s.:

你认为 cb.treat(..) 会做一个沮丧的想法是行不通的,因为 Number 不会 extend/inherit LocalDateTime。即使有可能也会出现问题,因为没有办法直接在数据库端将数据库 timestamp 类型转换为任何 Number

我发现 这可能对您有所帮助。接受的答案使用标准 (?) SQL 函数 TIMESTAMPDIFF,这应该是完全独立于实现的解决方案。您可以根据该答案进行一些通用排序。

但是,一种选择是为持续时间/间隔添加一个新的计算字段,例如:

private Duration duration;

@PrePersist // update on each persist
private void calcDuration() {
    duration = Duration.between(start, lastUpdate);
}

那么订购会是这样的:

Path<Long> duration = root.get("duration");  // duration is stored as bigint or like
criteriaQuery.orderBy(criteriaBuilder.desc(duration)); // or .asc(..)

自然地 duration 在 db 中消耗额外的 space - 它通常应该只是短暂的 and/or 计算值 - 但它也可能带来一些性能提升。