2015-04-02 85 views
8

我想查詢一個Cassandra表使用IN子句和Spring數據的@Query註釋。我有一個帶有last_name分區鍵和first_name集羣鍵的表。IN子句與春季數據和卡桑德拉@查詢

我有這樣的查詢工作

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

沒有發現,庫搜索一個人用串連名('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

你嘗試過任何Collection類型嗎?設置或字符串列表而不是字符串數組? – 2015-04-02 19:53:57

+0

這兩個列表和集合在啓動時返回類似於此的錯誤 '由...引發:java.lang.IllegalArgumentException:遇到不支持的查詢參數類型[interface java.util。設置]' – 2015-04-03 20:40:47

回答

8

你有當您使用IN使用護腕。

@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,我最終'無效的綁定變量量異常。 我能夠得到它傳遞一個單一的字符串來限制,但當傳入一個數組我在啓動時看到這個 '由於:java.lang.IllegalArgumentException:遇到不受支持的查詢參數類型[類[Ljava .lang.String;]' – 2015-04-03 20:44:58

+1

然後你可以嘗試第一個。你的相同查詢與手鐲。像'IN(?1)' – 2015-04-03 21:06:42

+0

如果我傳入一個名稱,它確實有效。如果我傳遞多個,它會被包裹在引號中,以便查詢結束'IN('Joe,Jim')'。顯然,沒有人被命名爲「喬,吉姆」。我也嘗試過建立一個請求字符串,'Joe','Jim',但是當它在圖書館中傳遞時會跳過所有的引號,並且最終以'''Joe'','Jim''''' – 2015-04-06 19:05:49

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