2013-11-10 5 views
5

Ich habe die folgenden Einheiten-Mapping:Erzeugung Abfrage, wenn die ManyToMany Beziehung von Spring Data JPA Projekt verwendet wird

@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 Schnittstelle nachgeschlagen:

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

Bitte beheben Sie mich, wenn ich in der Abfrage selbst falsch liege. Wenn ich Test für die findByCategories Methode laufen, erhalte ich die Fehlermeldung:

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

Welche Option muss ich es lösen haben?

Und die zweite, kann ich Spring Data Jpa Logik debuggen, die das Argument in die Abfrage? Ich erhalte einen Proxy, der von Spring Data Jpa zurückgegeben wird. Ich kann nicht verstehen, wo der Breakpoint verwendet werden soll, um dieses Verhalten zu debuggen.

UPDATE: ich es (?1) unter Verwendung behoben haben:

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

statt

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

Antwort

14

Da Parameternamen in Bytecode verloren gehen, müssen Sie @Param Anmerkung, um anzuzeigen, um den Parameter verwenden Das ist als :category Variable in Ihrem JPQL zugeordnet. So würden Sie Code wie folgt aussehen:

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

?1 sicher funktioniert, ist aber wahrscheinlich nicht so lesbar.

Verwandte Themen