我的 JpaRepository 中有一个查询方法
Page<Course> findDistinctCourseByAttrsInAllIgnoreCase(Set<String> a, Pageable page);
查找Course
对象的实例变量 Set<String> attrs
。给定一组a
对于“foo”和“bar”,我想找到Course
其attrs
包含“foo”和“bar”,即 Course
的交集带有“foo”的和带有“bar”的。上面的方法返回一个联合。
有没有办法通过 JpaRepository 查询来做到这一点,还是我必须进行多次调用并自己找到交集?
最佳答案
在不太可能的情况下,您知道 a
的数量前面你可以将多个约束与 And
结合起来:
...AttrsInAndAttrsIn...
但即使前提条件成立,那也会非常难看。
因此,下一个最佳选择可能是一个规范和一个从 Set<String>
构造规范的工厂方法。或来自可变参数。
您的存储库需要扩展JpaSpecificationExecutor
。
你可以这样调用它
Page<Course> findAll(matchesAll(attrs), pageable)
工厂方法看起来像这样:
Specification<Course> matchesAll(Set<String> attrs) {
return (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
// construct Predicate by combining calls to builder.isMember
// https://docs.oracle.com/javaee/6/api/javax/persistence/criteria/CriteriaBuilder.html#isMember(E,%20javax.persistence.criteria.Expression)
}
}
关于mysql - Spring JpaRepository findBy...In(Collection) 返回并集而不是交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47527594/