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<Book> findAllByCategoriesIn(Collection<Category> categories);
希望对解决问题有所帮助。
【讨论】:
以上是关于Spring Data Jpa项目使用ManyToMany关系时的生成查询的主要内容,如果未能解决你的问题,请参考以下文章
对于大型项目,Spring Data JPA 与 Hibernate 有何不同?
Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍