簡體   English   中英

Spring Data Jpa項目使用ManyToMany關系時的生成查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM