0

我的 JpaRepository 中有一个查询方法

    Page<Course> findDistinctCourseByAttrsInAllIgnoreCase(Set<String> a, Pageable page);

Course通过实例变量查找对象Set<String> attrs。给定一个a带有“foo”和“bar”的集合,我想找到同时包含“foo”Course“bar”的s ,即s与“foo”和“bar”的交集。上面的这个方法返回一个联合。 有没有办法通过 JpaRepository 查询来做到这一点,还是我必须拨打多个电话并自己找到交叉点?attrsCourse

4

2 回答 2

1

在不太可能的情况下,您可以预先知道as 的数量,您可以将多个约束与And

...AttrsInAndAttrsIn...

但即使前提条件成立,那也是非常难看的。

因此,下一个最佳选择可能是 Specification 和 factoryMethod 从 aSet<String>或 varargs 构造 Specification。

您的存储库需要扩展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)

    }
}
于 2017-11-28T11:25:27.487 回答
0

像这样的东西应该使它:

@Query("SELECT c FROM Course c JOIN Attribute a WHERE LOWER(a.name) IN (:attributes) GROUP BY c HAVING COUNT(c) = :size")
public Page<Course> findByAllAttributes(@Param("attributes") Set<String> attributes, @Param("size") Integer size, Pageable page);

你这样称呼它:

Page<Course> page = findByAllAttributes(set.stream()
      .map(String::toLowerCase)
      .collect(Collectors.toSet(), 
   set.size(), page);
于 2017-11-28T14:16:57.650 回答