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