Spring Data Jpa项目使用ManyToMany关系时的生成查询

Posted

技术标签:

【中文标题】Spring Data Jpa项目使用ManyToMany关系时的生成查询【英文标题】:Generation query when the ManyToMany relationship is used by Spring Data Jpa project 【发布时间】:2013-11-22 02:33:33 【问题描述】:

我有以下实体映射:

@Entity
@Table(name = "books")
public class Book implements Serializable 
    @ManyToMany
    @JoinTable(name="books2categories",
    joinColumns=@JoinColumn(name="book_id"),
    inverseJoinColumns=@JoinColumn(name="category_id"))
    Collection<Category> categories;

...

@Entity
@Table(name = "categories")
public class Category implements Serializable 
    @ManyToMany(mappedBy="categories")
    private Collection<Book> books;

BookRepository 界面查看:

public interface BookRepository extends JpaRepository<Book, Long> 

    @Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")
    List<Book> findByCategories(Collection<Category> categories);

如果我的查询本身有误,请纠正我。 当我为 findByCategories 方法运行测试时,我收到了错误:

testFindByCategories(com.savdev.springmvcexample.repository.JpaBookRepositoryTest): org.hibernate.QueryParameterException:位置超出数量 声明的序数参数。请记住,序数参数是 1为主!职位:1;嵌套异常是 java.lang.IllegalArgumentException: org.hibernate.QueryParameterException:位置超出数量 声明的序数参数。请记住,序数参数是 1为主!位置:1

我必须通过哪个选项来解决它?

第二个,我可以调试将参数传递给查询的 Spring Data Jpa 逻辑吗? 我收到 Spring Data Jpa 返回的代理,无法理解在哪里使用断点来调试此行为。

更新: 我已经使用(?1) 修复了它:

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (?1)")

而不是

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")

【问题讨论】:

【参考方案1】:

由于参数名称在字节码中丢失,您需要使用@Param 注释来指示在您的JPQL 中映射为:category 变量的参数。因此,您的代码如下所示:

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")
List<Book> findByCategories(@Param("categories") Collection<Category> categories);

?1 确实有效,但可能不那么可读。

【讨论】:

【参考方案2】:

您可以直接使用 JPA 命名约定来解决问题。

List&lt;Book&gt; findAllByCategoriesIn(Collection&lt;Category&gt; categories);

希望对解决问题有所帮助。

【讨论】:

以上是关于Spring Data Jpa项目使用ManyToMany关系时的生成查询的主要内容,如果未能解决你的问题,请参考以下文章

对于大型项目,Spring Data JPA 与 Hibernate 有何不同?

Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

Spring-data-jpa 投影生成查询不正确

Spring Data Jpa项目使用ManyToMany关系时的生成查询

最近项目中使用Spring data jpa 踩过的坑

Spring Data JPA