1

今天我迁移到 Astyanax 1.56.42 并发现,准备好的语句上的 withValues() 似乎不适用于SQL SELECT...WHERE...IN ()

ArrayList<ByteBuffer> uids = new ArrayList<ByteBuffer>(fileUids.size());
for (int i = 0; i < fileUids.size(); i++) {
    uids.add(ByteBuffer.wrap(UUIDtoByteArray(fileUids.get(i)), 0, 16));
}

result = KEYSPACE.prepareQuery(CF_FILESYSTEM)
    .withCql("SELECT * from files where file_uid in (?);")
    .asPreparedStatement()
    .withValues(uids)
    .execute();

如果我的 ArrayList 包含多个条目,则会导致错误

SEVERE: com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=hostname(hostname):9160, latency=5(5), attempts=1]InvalidRequestException(why:there were 1 markers(?) in CQL but 2 bound variables)

我究竟做错了什么?有没有其他方法来处理SQL SELECT...WHERE...IN () - 语句或者我发现了一个错误?

最好的问候克里斯

4

1 回答 1

1

正如您所提到的,因为您向单个?Astyanax 提供集合(ArrayList)会引发异常。我认为您需要为要在子句?中包含的每个元素添加一个。IN

假设您希望将 2 个整数存储在名为 arrayListObj 的 where 子句的 ArrayList 中,您的语句如下所示:

SELECT & FROM users WHERE somevalue IN (arrayListObj);

因为您正在提供一个集合,所以这无法正常工作,因此您将需要多个?'s。即你想要:

SELECT name, occupation FROM users WHERE userid IN (arrayListObj.get(0), arrayListObj.get(1));

我在Astyanax wiki上找不到任何关于使用IN准备好的语句的子句。

于 2013-06-25T23:35:39.640 回答