7

次のエンティティのマッピングがあります。

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

2 に答える 2

18

パラメーター名はバイトコードで失われるため、@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確かに機能しますが、おそらく読みにくいです。

于 2013-11-10T20:46:09.080 に答える