【问题标题】:Generation query when the ManyToMany relationship is used by Spring Data Jpa projectSpring Data Jpa项目使用ManyToMany关系时的生成查询
【发布时间】: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)")

【问题讨论】:

    标签: java spring many-to-many jpql spring-data-jpa


    【解决方案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);

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

      【讨论】:

        猜你喜欢
        • 2019-03-09
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2021-03-17
        • 2021-03-16
        相关资源
        最近更新 更多