2013-11-10 24 views
5

Aşağıdaki kişiler eşleme ettik:Nesil sorgu

@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 arayüzü aranacaktır:

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); 

Sorgunun kendisinde hatalıysam lütfen beni düzeltin. Ben findByCategories yöntemi için testi, ben hatayı alıyorum:

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

hangi seçenek bunu çözmek gerekiyor?

Ve ikincisi, argümanı sorguya ileten Spring Data Jpa mantığında hata ayıklayabilir miyim? Spring Data Jpa tarafından döndürülen bir proxy alıyorum, bu davranışın hatalarını ayıklamak için break point'in nerede kullanılacağını anlayamıyorum.

GÜNCELLEME: Ben (?1) kullanarak çözdüm : parametre adları byte kaybolur yana

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (?1)") 

yerine

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)") 

cevap

14

, sen parametresini belirtmek için @Param ek açıklama kullanmak gerekir Bu, JPQL'inizde :category değişkeni olarak eşlenir.

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)") 
List<Book> findByCategories(@Param("categories") Collection<Category> categories); 

?1 kesinlikle çalışır, ancak muhtemelen okunabilir değil: Yani, size kod gibi görünecektir.