Критерии API порядок по времени между двумя LocalDateTime - PullRequest
0 голосов
/ 11 февраля 2019

Учитывая сущность с двумя полями даты типа 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 может рассматриватьэто как метка времени как-то?Он сохраняется как отметка времени в базе данных после того, как все

пс:

  • с использованием EclipseLink 2.7.3
  • в поисках решения, которое не связано сконкретная база данных

1 Ответ

0 голосов
/ 11 февраля 2019

Ваша идея 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 потребляет дополнительное пространство в дБ - и обычно это должно быть только переходное и / или расчетное значение - но это также может принести некоторое повышение производительности.

...