У меня есть сущность Activity
, которая находится в @ManyToOne
связи с сущностью Event
и их соответствующими метамоделями - Activity_
и Event_
были сгенерированы генератором моделей JPA.
IСоздал специализированные классы ActivitySpecifications
и EventSpecifications
.Эти классы содержат только статические методы, которые возвращают Specification
.Например:
public interface EventSpecifications {
static Specification<Event> newerThan(LocalDateTime date) {
return (root, cq, cb) -> cb.gt(Event_.date, date);
}
...
}
, поэтому, когда я хочу создать запрос, соответствующий нескольким спецификациям, я могу выполнить следующую инструкцию, используя findAll
в JpaSpecificationExecutor<Event>
хранилище.
EventSpecifications.newerThan(date).and(EventSpecifications.somethingElse())
и ActivitySpecifications
пример:
static Specification<Activity> forActivityStatus(int status) { ... }
Как использовать EventSpecifications
из ActivitySpecifications
?Я имею в виду как спецификации слияния разного типа.Извините, но я даже не знаю, как правильно спросить, но вот простой пример:
Я хочу выбрать все действия со статусом = :status
и где activity.event.date
больше :date
static Specification<Activity> forStatusAndNewerThan(int status, LocalDateTime date) {
return forActivityStatus(status)
.and((root, cq, cb) -> root.get(Activity_.event) ....
// use EventSpecifications.newerThan(date) somehow up there
}
Возможно ли что-то подобное?
Самое близкое, что приходит мне в голову, это использовать следующее:
return forActivityStatus(status)
.and((root, cq, cb) -> cb.isTrue(EventSpecifications.newerThan(date).toPredicate(???, cq, cb));
, где ???
требуетRoot<Event>
, но я могу получить Path<Event>
только с помощью root.get(Activity_.event)
.