20

Oliver Gierke の優れたライブラリであるSpring-dataには、仕様(org.springframework.data.jpa.domain.Specification) と呼ばれるものがあります。それを使用すると、いくつかの述語を生成して、検索の基準を絞り込むことができます。

誰かが仕様内からサブクエリを使用する例を提供できますか?

オブジェクト グラフがあり、検索基準が非常に複雑になる可能性があります。仕様を使用して検索を絞り込みたいのですが、サブクエリを使用して、オブジェクト グラフ内の (コレクション内の) サブ要素の一部が検索のニーズを満たすかどうかを確認する必要があります。

前もって感謝します。

4

1 に答える 1

36
String projectName = "project1";
List<Employee> result = employeeRepository.findAll(
    new Specification<Employee>() {
        @Override
        public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Subquery<Employee> sq = query.subquery(Employee.class);
            Root<Project> project = sq.from(Project.class);
            Join<Project, Employee> sqEmp = project.join("employees");
            sq.select(sqEmp).where(cb.equal(project.get("name"),
                    cb.parameter(String.class, projectName)));
            return cb.in(root).value(sq);
        }
    }
);

次の jpql クエリと同等です。

SELECT e FROM Employee e WHERE e IN (
    SELECT emp FROM Project p JOIN p.employees emp WHERE p.name = :projectName
)
于 2012-12-28T10:37:57.690 に答える