2013-11-10 3 views
5

मैंने निम्नलिखित संस्थाओं मानचित्रण:पीढ़ी क्वेरी जब ManyToMany संबंध स्प्रिंग डाटा जेपीए परियोजना द्वारा किया जाता है

@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) का उपयोग करके इसे ठीक करने के बाद:

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

उत्तर

14

की

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

बजाय पैरामीटर नाम बाईटकोड में खो जाते हैं के बाद से, आप पैरामीटर इंगित करने के लिए @Param एनोटेशन उपयोग करने की आवश्यकता जिसे आपके जेपीक्यूएल में :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 निश्चित रूप से काम करता है, लेकिन शायद के रूप में पढ़ने योग्य नहीं है।

संबंधित मुद्दे