我有以下实体映射:
@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)")