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));
/* ... */
我目前的想法:
CriteriaBuilder#diff
希望其参数源自 Number
,而 LocalDateTime 并不
CriteriaBuilder#treat
也许以某种方式将其视为时间戳?毕竟它作为时间戳存储在数据库中
p.s.:
- 使用 EclipseLink 2.7.3
- 寻找不依赖于特定数据库的解决方案
你认为 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 计算值 - 但它也可能带来一些性能提升。
给定一个实体,该实体具有两个 LocalDateTime
类型的日期字段:
class MyEntity {
private LocalDateTime start;
private LocalDateTime lastUpdate;
}
我想编写一个带有条件 api 的查询,按这两个日期之间的时间对结果集进行排序。
/* ... */
Root<MyEntity> root = query.from(MyEntity.class);
Order order = ???
root.orderBy(cb.desc(order));
/* ... */
我目前的想法:
CriteriaBuilder#diff
希望其参数源自Number
,而 LocalDateTime 并不CriteriaBuilder#treat
也许以某种方式将其视为时间戳?毕竟它作为时间戳存储在数据库中
p.s.:
- 使用 EclipseLink 2.7.3
- 寻找不依赖于特定数据库的解决方案
你认为 cb.treat(..)
会做一个沮丧的想法是行不通的,因为 Number
不会 extend/inherit LocalDateTime
。即使有可能也会出现问题,因为没有办法直接在数据库端将数据库 timestamp
类型转换为任何 Number
。
我发现 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 计算值 - 但它也可能带来一些性能提升。