2015-04-02 7 views
8

के साथ खंड में मैं IN खंड और स्प्रिंग डेटा से @Query एनोटेशन का उपयोग कर एक कैसंड्रा तालिका से पूछताछ करने का प्रयास कर रहा हूं। मेरे पास last_name की विभाजन कुंजी और first_name की क्लस्टरिंग कुंजी वाला एक टेबल है।स्प्रिंग डेटा और कैसंड्रा @Query

मैं इस क्वेरी

@Query("SELECT * FROM people WHERE last_name=?0") 
public List<People> findByLastName(String lastName); 

काम कर रहा है और मैं

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN ?1") 
public List<People> findByLastName(String lastName, String[] firstName); 

की तरह कुछ करना चाहते हैं मैं इसे

CassandraOperations.select("SELECT * FROM people WHERE last_name=" + lastName + 
" AND first_name IN (" + concatinatedNameList + ")", People.class); 

का उपयोग कर काम कर रहा लेकिन कई कारणों से के लिए है (कोड शैली, परीक्षण, मैं कसम खाता हूं और अधिक हैं) मैं @Query का उपयोग करना पसंद करूंगा। कोई विचार?

अधिक जानकारी के लिए संपादित करें!

एक सरणी में पासिंग, सेट करें या सूची लौटाती है Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract

भी करने की कोशिश की:

String firstName = "Joe,Jim"; 
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)") 
public List<People> findByLastName(String lastName, String firstName); 

कुछ नहीं मिला, एक ही व्यक्ति के लिए पुस्तकालय खोजें एक concatinated नाम ('Joe,Jim')

String firstName = "'Joe','Jim'"; 
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)") 
public List<People> findByLastName(String lastName, String firstName); 
साथ

कुछ भी नहीं मिला, अनुरोध बच निकला है और ('''Joe'',''Jim''')

समाप्त होता है
String firstName = "Joe','Jim"; // Hoping the library would just add the outer quotes, getting desperate 
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)") 
public List<People> findByLastName(String lastName, String firstName); 

कुछ नहीं मिला, अनुरोध भाग निकले और ('Joe'',''Jim')

+1

क्या आपने कोई संग्रह प्रकार आजमाया है? स्ट्रिंग सरणी के बजाय तारों की सेट या सूची? –

+0

दोनों सूचियां और समूह स्टार्टअप पर इस तरह की एक त्रुटि लौटाते हैं: इसके कारण: java.lang.IllegalArgumentException: असमर्थित क्वेरी पैरामीटर प्रकार का सामना करना पड़ा [इंटरफ़ेस java.util।सेट करें] ' –

उत्तर

8

जब आप IN उपयोग कर रहे हैं bracers उपयोग करने के लिए समाप्त होता है।

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)") 
public List<People> findByLastName(String lastName, String[] firstName); 

लेकिन आपके कोड में कुछ अन्य समस्याएं हैं। मैंने उन्हें नीचे एक अच्छे कोडिंग मानकों में बदल दिया। नामित पैरामीटर का उपयोग करने के अपने व्यक्तिगत पसंदीदा सहित।

@Query("SELECT p FROM People p WHERE p.lastName = :lastName AND p.firstName IN (:firstNames)") 
public List<People> findByName(@Param("lastName") String lastName, @Param("firstNames") String[] firstNames); 
+0

मेरी इच्छा है कि मैं नामित पैरामीटर का उपयोग कर सकूं, लेकिन चूंकि मैं वास्तव में 7 में गुजर रहा हूं, इसलिए मैं 'बाइंड वैरिएबल अमान्य अमान्य' अपवाद के साथ समाप्त होता हूं। मैं इसे रोकने के लिए एक स्ट्रिंग में गुजरते समय इसे काम करने में सक्षम हूं, लेकिन जब किसी सरणी में गुज़रता है तो मैं इसे स्टार्टअप पर देखता हूं: द्वारा जावा: lang.IllegalArgumentException: असमर्थित क्वेरी पैरामीटर प्रकार का सामना करना पड़ा [वर्ग [Ljava .lang.String;] ' –

+1

फिर आप पहले प्रयास कर सकते हैं। ब्रैकेट के साथ आपकी एक ही क्वेरी। 'IN (? 1)' –

+0

की तरह यदि मैं एक ही नाम में जाता हूं, तो यह काम करता है। यदि मैं एकाधिक पास करता हूं, तो यह उद्धरणों में लपेटा जाता है ताकि क्वेरी 'IN (' जो, जिम ') समाप्त हो। जाहिर है, किसी को भी 'जो, जिम' नाम दिया गया है। मैंने एक अनुरोध स्ट्रिंग, 'जो', 'जिम' बनाने का भी प्रयास किया, लेकिन जब पुस्तकालय में यह पारित हो जाता है तो सभी उद्धरणों से बच निकलता है और मैं '' '' '' '' जिम '' '' –

2

ऐसा लगता है कि यह संभव नहीं है!

मैंने spring-data-cassandra-1.3.2.RELEASE.jar के स्रोत कोड की जांच की।

क्वेरी विधि में पैरामीटर के अनुमत डेटा प्रकार String.class, CharSequence.class, char.class, Character.class, char[].class, long.class, Long.class, boolean.class, Boolean.class, BigDecimal.class, BigInteger.class, double.class, Double.class, float.class, Float.class, InetAddress.class, Date.class, UUID.class, int.class are Integer.class हैं।

वे

org.springframework.data.cassandra.repository.query.CassandraQueryMethod.ALLOWED_PARAMETER_TYPES = Collections.unmodifiableList(Arrays 
      .asList(new Class<?>[] { String.class, CharSequence.class, char.class, Character.class, char[].class, long.class, 
        Long.class, boolean.class, Boolean.class, BigDecimal.class, BigInteger.class, double.class, Double.class, 
        float.class, Float.class, InetAddress.class, Date.class, UUID.class, int.class, Integer.class })); 

अगर हम इन के अलावा अन्य डेटा प्रकार पारित में पाया जा सकता है, तो org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(Method method, RepositoryMetadata metadata)IllegalArgumentException फेंक देते हैं।

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