多对多 JPQL @Query 与 List 作为 Spring 中的参数
Posted
技术标签:
【中文标题】多对多 JPQL @Query 与 List 作为 Spring 中的参数【英文标题】:Many to many JPQL @Query with List as argument in Spring 【发布时间】:2018-03-22 05:23:23 【问题描述】:我有一个简单的 Product-Category 多对多关系,其中 Product 有一个 List "categories" 属性,Category 有一个 List "products" 属性。 JPA ORM 映射非常好用。
在 ProductRepository 中,我想包含一个方法,该方法将部分名称和类别列表作为参数,并返回包含给定名称和参数列表中的任何类别的所有产品。我的问题是:是否可以在 @Query 中指定我的查询?怎么样?
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>
@Query("SELECT obj FROM Product obj WHERE obj.name LIKE %?1 AND obj.categories ?????")
List<Product> findByNameCategories(String name, List<Category> categorias);
【问题讨论】:
【参考方案1】:你快到了。您可以制作查询来做您想做的事,而无需使用 @Query
注释
List<Product> findByNameStartingWithAndCategoriesIn(String name, Set<Category> categorias);
对于不同的结果:
Set<Product> findDistinctByNameStartingWithAndCategoriesIn(String name, Set<Category> categorias);
Spring 会自动为您创建正确的查询。您也可以 EndingWith
包装以 % 结尾的参数或 Containing
让参数两边都用 % 包装
我将您的 List<Category> categorias
更改为 Set,因为列表中可以有重复的 Category 对象,而 Set 不会,所以当它在后台制作查询时,您将在 In 子句中拥有唯一的 ID。
Spring Documentation on crafting queries
【讨论】:
对标准名称的使用很棒,谢谢。只有一个问题:该方法返回重复的产品。为了获得不同的产品,我将返回类型替换为 Set 但这是我的问题:显然所有重复的值都来自数据库,然后它们由 Set 数据结构进行后过滤。有没有更好的方法来获得不同的值?换句话说:直接从数据库中获取不同的值?以上是关于多对多 JPQL @Query 与 List 作为 Spring 中的参数的主要内容,如果未能解决你的问题,请参考以下文章