Java 带有Spring数据和Cassandra@Query的IN子句

Java 带有Spring数据和Cassandra@Query的IN子句,java,spring,cassandra,spring-data,spring-data-cassandra,Java,Spring,Cassandra,Spring Data,Spring Data Cassandra,我试图使用IN子句和来自Spring数据的@query注释来查询Cassandra表。我有一个表,它的分区键是last_name,集群键是first_name 我有这个问题 @Query("SELECT * FROM people WHERE last_name=?0") public List<People> findByLastName(String lastName); 但是出于一些原因(代码风格、测试,我发誓还有更多),我更喜欢使用@Query。有什么想法吗 编辑以获取更多

我试图使用IN子句和来自Spring数据的@query注释来查询Cassandra表。我有一个表,它的分区键是last_name,集群键是first_name

我有这个问题

@Query("SELECT * FROM people WHERE last_name=?0")
public List<People> findByLastName(String lastName);
但是出于一些原因(代码风格、测试,我发誓还有更多),我更喜欢使用@Query。有什么想法吗

编辑以获取更多信息

传入数组、集合或列表返回由以下原因引起的
:java.lang.IllegalArgumentException:在方法公共抽象中遇到不支持的查询参数类型[class[Ljava.lang.String;]

还尝试:

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”//希望库只添加外部引号,绝望了
@查询(“从姓氏=?0,姓氏(?1)”的人中选择*)
公共列表findByLastName(字符串lastName、字符串firstName);

找不到任何内容,请求被转义并最终被更新

在当前的spring中,它似乎在没有支架的情况下工作


旧答案

在中使用
时,必须使用大括号

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)")
public List<People> findByLastName(String lastName, String[] firstName);
@Query(“从姓氏=?0,姓氏(?1)”的人中选择*)
公共列表findByLastName(字符串lastName,字符串[]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);
@Query(“从人物p中选择p,其中p.lastName=:lastName和p.firstName位于(:firstNames)”)
公共列表findByName(@Param(“lastName”)字符串lastName,@Param(“firstNames”)字符串[]firstNames);

这似乎是不可能的

我检查了的源代码

查询方法中允许的参数数据类型为
String.class、CharSequence.class、char.class、Character.class、char[]类、long.class、long.class、boolean.class、boolean.class、BigDecimal.class、biginger.class、double.class、double.class、float.class、float.class、InetAddress.class、Date.class、UUID.class、int.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.ALLOWED\u PARAMETER\u TYPES=Collections.unmodifiableList(数组
.asList(新类[]{String.Class,CharSequence.Class,char.Class,Character.Class,char[].Class,long.Class,
Long.class、boolean.class、boolean.class、BigDecimal.class、biginger.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(方法,RepositoryMetadata)
将抛出
IllegalArgumentException

Nitish Bhagat是正确的,使用当前版本的spring数据cassandra:2.0.6.RELEASE它不使用大括号

对我来说,它只适用于而不适用于大括号,如:

@查询(“从名字在?0中的人中选择*)
公共列表findByFirstName(列表名);

是否尝试了任何集合类型?集合或字符串列表而不是字符串数组?列表和集合在启动时都返回类似的错误
,原因是:java.lang.IllegalArgumentException:遇到不支持的查询参数类型[interface java.util.Set]
我希望我可以使用命名参数,但由于我实际上是在传递7,我最终得到了
无效数量的绑定变量
异常。当传递单个字符串以约束时,我能够使其工作,但当传递数组时,我在启动时看到这一点
原因是:java.lang.IllegalArgumentException:遇到不受支持的查询参数类型[class[Ljava.lang.String;]
那么您可以尝试第一个。您的同一个查询使用大括号。如(?1)
中的
如果我传入一个名称,它就可以工作。如果传入多个名称,它将被括在引号中,因此查询将以('Joe,Jim'中的
结束
。显然,没有人叫‘Joe,Jim’。我也尝试过构建请求字符串,
‘Joe’,‘Jim’
,但当它在库中传递时,会转义所有的引号,我最后得到的是
‘Joe’,‘Jim’
我想这些查询都在接口中,所以你不需要公共修饰符,如果你不需要的话,它就可以工作了没有大括号。
@Query(“SELECT*FROM people WHERE last_name=?0 AND first_name IN?1”)公共列表findByLastName(String lastName,List firstName);
那么,你接受了一条评论并给出了自己的答案?
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);
@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);
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 }));