带有Spring Data和Cassandra @Query的IN子句

Bil*_*l H 10 java spring cassandra spring-data spring-data-cassandra

我正在尝试使用IN子句和Spring Data中的@Query注释来查询Cassandra表.我有一个表,其分区键为last_name,聚类键为first_name.

我有这个查询工作

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

我想做点什么

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

我有它正在使用

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

但由于一些原因(代码风格,测试,我发誓还有更多)我宁愿使用@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);
Run Code Online (Sandbox Code Playgroud)

没有找到,图书馆搜索具有连接名称的单个人 ('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);
Run Code Online (Sandbox Code Playgroud)

没有找到,请求被转义并最终结束 ('''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);
Run Code Online (Sandbox Code Playgroud)

没有找到,请求被转义并最终结束 ('Joe'',''Jim')

Far*_*ook 10

使用时必须使用护腕IN.

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

但是您的代码中还存在其他一些问题.我将它们全部改为良好的编码标准,如下所示.包括我个人最喜欢使用命名参数.

@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);
Run Code Online (Sandbox Code Playgroud)

  • 使用当前的春天Cassandra,如果你没有大括号,它就可以工作.````("SELECT*FROM people WHERE last_name =?0 AND first_name IN?1")public List <People> findByLastName(String lastName,List <String > firstName); ``` (4认同)