代码示例:
@Entity
public class Event {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(...)
private List<Actions> actions;
}
@Entity
public class Action {
@Id
@GeneratedValue
private Long id;
private String name;
private Date date;
@ManyToOne
@JoinColumn(name = "event_id")
private Event event;
}
public class EventSpecification {
public static Specification<Event> findByCriteria(EventSearchCriteria criteria) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
criteria.getEventName().ifPresent(name ->
predicates.add(criteriaBuilder.equal(criteriaBuilder.lower(root.get(Event_.name)), name)));
criteria.getDate().ifPresent(date ->
// Need one more Predicat - event.has.actions.with.date.equals.criteria.date
);
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
};
}
}
问题是:
如何使用Action.date = searchCriteria.date创建具有Actions的谓词 - 仅事件。我认为这是可能的,但我找不到解决方案。
答案 0 :(得分:1)
也许这会帮助你指出正确的方法
criteria.getDate().ifPresent(date -> {
Join join = root.join("actions");
predicates.add(criteriaBuilder.equal(join.get("date"), date);
});