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';