规范内的spring数据子查询

规范内的spring数据子查询,spring,subquery,criteria-api,spring-data,Spring,Subquery,Criteria Api,Spring Data,,Oliver Gierke的优秀库,有一个叫做(org.springframework.data.jpa.domain.Specification)的东西。使用它,您可以生成几个谓词来缩小搜索条件 有人能提供一个在规范中使用子查询的例子吗 我有一个对象图,搜索条件可能会非常复杂。我希望使用规范来帮助缩小搜索范围,但我需要使用子查询来查看对象图中的某些子元素(在集合中)是否满足搜索的需要 提前感谢。是否可以以类似的方式显式使用常量SQL语句?可以。要传递常量值,请使用cb.literal(100

,Oliver Gierke的优秀库,有一个叫做(org.springframework.data.jpa.domain.Specification)的东西。使用它,您可以生成几个谓词来缩小搜索条件

有人能提供一个在规范中使用子查询的例子吗

我有一个对象图,搜索条件可能会非常复杂。我希望使用规范来帮助缩小搜索范围,但我需要使用子查询来查看对象图中的某些子元素(在集合中)是否满足搜索的需要


提前感谢。

是否可以以类似的方式显式使用常量SQL语句?可以。要传递常量值,请使用cb.literal(1000)在select子句中可以使用子查询吗?在本例中,子查询位于where子句中。
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);
        }
    }
);
SELECT e FROM Employee e WHERE e IN (
    SELECT emp FROM Project p JOIN p.employees emp WHERE p.name = :projectName
)