Ваша идея cb.treat(..)
, которая будет выполнять понижение, не будет работать, потому что Number
не расширяет / не наследует LocalDateTime
.И даже если бы это было возможно, возникла бы проблема, потому что не было бы способа привести тип базы данных timestamp
к любому Number
либо непосредственно на стороне базы данных.
Я нашел thisвопрос , который может вам помочь.Принятый ответ использует стандартную (?) Функцию 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
потребляет дополнительное пространство в дБ - и обычно это должно быть только переходное и / или расчетное значение - но это также может принести некоторое повышение производительности.