Astyanax parepared声明withvalues()无法正常工作

时间:2013-06-25 22:55:56

标签: cassandra astyanax

今天我迁移到Astyanax 1.56.42并发现,对于 SQL SELECT ... WHERE ... IN(),预处理语句中的withValues()似乎不能正常工作。< / p>

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() - 语句还是我找到了错误?

祝你好运 克里斯

1 个答案:

答案 0 :(得分:1)

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

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

SELECT & FROM users WHERE somevalue IN (arrayListObj);

因为你正在提供一个集合,所以这不行,所以你需要多个?。即你想要的:

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

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