10

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

我有这个查询工作

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

4

3 回答 3

10

更新

在当前的春天,它似乎在没有大括号的情况下工作。


旧答案

使用时必须使用护腕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);
于 2015-04-03T16:01:17.770 回答
2

Nitish Bhagat 是对的,当前版本 spring-data-cassandra:2.0.6.RELEASE 不适用于大括号。

对我来说,它只有在没有大括号的情况下才有效,例如: @Query("SELECT * FROM people WHERE first_name IN ?0") public List<People> findByFirstName(List<String> firstName);

于 2018-05-12T08:57:10.243 回答
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.

于 2016-02-08T14:50:15.337 回答