Могу ли я создать спецификацию Spring JPA, чтобы найти сущности, которые имеют максимальное или минимальное значение для поля ZonedDateTime? - PullRequest
0 голосов
/ 31 января 2019

У меня есть объект с именем ObjectRec, который имеет составной первичный ключ, который содержит поле UUID с именем id и поле ZonedDateTime с именем modified (дата последнего изменения объекта).

Мы можем иметь несколько «версий» каждого ObjectRec, для чего мы используем поле modified.Итак, ObjectRec с идентификатором «A» может иметь две записи, но с двумя разными датами изменения.

Я специально пытаюсь использовать API спецификации JPA Spring для создания спецификации, которая позволит мне выполнять запросы на основена «версии», потому что мы ожидаем, что многие спецификации будут объединены различными способами.

Я испробовал множество различных способов создания простого запроса, чтобы выполнить поиск всех объектов, но возвращал только 1 версию каждого объекта в зависимости от того, является ли modified объекта минимальным илимаксимум.

Поэтому я хотел бы создать спецификацию, которая выглядит следующим образом:

public static Specification<ObjectRec> version(String version) {
        return (root, query, cb) -> {
            if (version == null || version.isEmpty()) {
                return root.isNotNull();
            }
            switch (version.toLowerCase()) {
                case "first":
                // Can't figure this out
                case "last":
                // Can't figure this out
                default:
                    if (version.contains(",")) {
                        String[] timestamps = version.split(",");
                        Predicate[] predicates = new Predicate[timestamps.length];
                        for (int i = 0; i < timestamps.length; i++) {
                            predicates[i] = (cb.equal(root.<ObjectId>get("objectId").<ZonedDateTime>get("modified"), ZonedDateTime.parse(timestamps[i])));
                        }
                        return cb.or(predicates);
                    } else {
                        return cb.equal(root.<ObjectId>get("objectId").<ZonedDateTime>get("modified"), ZonedDateTime.parse(version, DateTimeFormatter.ISO_DATE_TIME));
                    }
            }
        };
    }

«Первый» и «последний» дали бы мне «наибольший» или «наименьший» ZonedDateTime для«измененное» значение.

Было доказано, что запрос в случае «по умолчанию» работает, поэтому я знаю, как правильно получить доступ к полю modified корня.Это позволяет получать конкретные версии, передавая ZonedDateTime (в формате ISO).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...