У меня есть объект с именем 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).