2013-11-10 14 views
5

私は次のエンティティのマッピングをしました:世代クエリ

@Entity 
@Table(name = "books") 
public class Book implements Serializable { 
    @ManyToMany 
    @JoinTable(name="books2categories", 
    [email protected](name="book_id"), 
    [email protected](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: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1

どのオプション私はそれを解決する必要がありますか?

もう1つ、引数に引数を渡すSpring Data Jpaロジックをデバッグできますか? 私は、Spring Data Jpaによって返されたプロキシを取得していますが、この動作をデバッグするためにブレークポイントを使用する場所を理解できません。

UPDATE:

@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)") 

答えて

14

パラメータ名は、バイトコードで失われているので、あなたはパラメータを示すために@Paramアノテーションを使用する必要があります:私は(?1)を使用して、それを修正しました これは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は確かに動作しますが、おそらく読めない:だから、あなたのコードは次のようになります。