mysql - Spring JpaRepository findBy...In(Collection) 返回并集而不是交集

标签 mysql spring hibernate spring-data-jpa spring-repositories

我的 JpaRepository 中有一个查询方法

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

查找Course对象的实例变量 Set<String> attrs 。给定一组a对于“foo”和“bar”,我想找到Courseattrs包含“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/

相关文章:

java - ORA-00979 : not a GROUP BY expression

mysql - 相当于pgpool-II for MySQL

java - 如何在添加 mvc 时解决 Spring MVC 中的 XmlBeanDefinitionStoreException :annotation-driven?

spring - Spring AOP中使用@Pointcut的方法是什么意思,只是一个切入点签名?

java - 使用 Spring Security 和 usersByUsernameQuery 进行身份验证

java - 无论如何,我无法在 Hibernate 中批处理 MySQL INSERT 语句

java - Hibernate:@ManyToMany 关系中对象集的传递持久性

php - 如何在codeigniter中使用mysql substring_index计算JSON格式数据的总和

sql - 根据层次结构对对象进行分类的良好模式是什么

php - 如何为 php-database-webservice 授权 android 应用程序?