Spring-data, Oliver Gierke\'s excellent library, has something called a Specification (org.springframework.data.jpa.domain.Specification). With it you can generate several
String projectName = "project1";
List result = employeeRepository.findAll(
new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
Subquery sq = query.subquery(Employee.class);
Root project = sq.from(Project.class);
Join sqEmp = project.join("employees");
sq.select(sqEmp).where(cb.equal(project.get("name"),
cb.parameter(String.class, projectName)));
return cb.in(root).value(sq);
}
}
);
is the equivalent of the following jpql query:
SELECT e FROM Employee e WHERE e IN (
SELECT emp FROM Project p JOIN p.employees emp WHERE p.name = :projectName
)