![](/img/trans.png)
[英]ManyToMany relationship not working when executing query (Spring Data JPA)
[英]Generation query when the ManyToMany relationship is used by Spring Data Jpa project
我有以下实体映射:
@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:超出声明的ordinal参数数量的位置。 请记住,序数参数是基于1的! 位置:1; 嵌套异常是java.lang.IllegalArgumentException:org.hibernate.QueryParameterException:超出声明的ordinal参数数量的位置。 请记住,序数参数是基于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)")
由于参数名称在字节码中丢失,因此您需要使用@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
肯定有效,但可能不那么可读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.