JPA Criteria API Specification按条件和结果JOIN不为null

时间:2018-01-23 10:00:28

标签: java jpa spring-data-jpa

代码示例:

@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的谓词 - 仅事件。我认为这是可能的,但我找不到解决方案。

1 个答案:

答案 0 :(得分:1)

也许这会帮助你指出正确的方法

criteria.getDate().ifPresent(date -> {
     Join join = root.join("actions");
     predicates.add(criteriaBuilder.equal(join.get("date"), date);
});