Java Criteria API, как написать Specification

@Entity 
@Table(name = "doc") 
public class DocEntity extends BaseEntity<Long> implements Auditable<Long> { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "doc_id") 
    private Long id; 
 
    @Column(name = "created") 
    private LocalDateTime created; 
 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "doc", cascade = CascadeType.ALL) 
    @BatchSize(size = 100) 
    private Set<SignEntity> signs = new HashSet<>(); 

.....

@Entity 
@Table(name = "sign") 
public class SignEntity extends BaseEntity<Long> { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "sign_id") 
    private Long id; 
 
    @Column(name = "signed") 
    private LocalDateTime signed; 

Есть Repository который использует Specification

Подскажите как построить правильно Predicat
В нутри SafeFilter filter
есть поле -

private FilterField<Interval<LocalDateTime>> date;    Это дата, я получаю её из frontend 



private static Predicate createPredicat(Root<DocEntity> root, 
                                        CriteriaQuery<?> query, 
                                        CriteriaBuilder builder, 
                                        SafeFilter<DocFilter> filter){ 
 
        Join<DocEntity, SignEntity> signs = root.join("signs"); 
        // Вспомогательный метод который создаёт Predicat , и с полем LocalDateTime created, начального объекта Root<DocEntity> root , это работает 
        FilterPredicateBuilder filterPredicateBuilder = FilterPredicateBuilder.of(builder) 
                .addInterval(root.get("created"),filter.getFilter().getDate()); 

Как мне составить правильно Predicate , что бы он учитывал значение коллекции Set signs , с условием если хотябы одна из дата у объекта этой коллекции входить в диапазон , то DocEntity входит в выборку

примерный аналог на SQL

select * from doc left join sign s on doc.doc_id = s.doc_id where s.signed > TIMESTAMP '1990-01-01 00:00:00' 
AND s.signed < TIMESTAMP '2021-01-01 00:00:00';

Ответы (0 шт):