web-dev-qa-db-ja.com

仕様内のspring-dataサブクエリ

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

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

私はオブジェクトグラフを持っていますが、検索条件はかなり厄介になる可能性があります。仕様を使用して検索を絞り込むのに役立てたいのですが、サブクエリを使用して、オブジェクトグラフ内の(コレクション内の)サブ要素の一部が検索のニーズを満たしているかどうかを確認する必要があります。

前もって感謝します。

16
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
)
30
Pieter