今天我迁移到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() - 语句还是我找到了错误?
祝你好运 克里斯
答案 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
子句的任何内容。