我的CQL3表就像这样
CREATE TABLE stringindice (
id text,
colname text,
colvalue blob,
PRIMARY KEY (id, colname, colvalue)
) WITH COMPACT STORAGE
我在其中插入了一些值。现在,当我尝试做这样的事情时:
QueryBuilder.select().all().from(keySpace, indTastringindice ble).where().and(QueryBuilder.eq("id", 'rowKey")).and(QueryBuilder.in("colname", "string1", "string2"));
基本上是
select * from stringindice where id = "rowkey" and colname IN ("string1", "string2")
我遇到以下异常:
com.datastax.driver.core.exceptions.InvalidQueryException: PRIMARY KEY part colname cannot be restricted by IN relation
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214)
at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169)
at com.datastax.driver.core.Session.execute(Session.java:110)
在CQL3的文档中,写的是
“而且,IN关系只允许在最后一列 分区键和完整主键的最后一列。“
所以似乎不支持!!如果是的话,那么如果我必须使用类似IN的东西来同时将多个值等同起来,那会是什么样的呢?
答案 0 :(得分:2)
这是因为您使用的是compact storage
,因此复合列为colname:colvalue
(值为空)。这意味着colname
不是完整主键的最后一列。
如果您不使用compact storage
(建议用于所有新数据模型),则您具有等效架构:
CREATE TABLE stringindice (
id text,
colname text,
colvalue blob,
PRIMARY KEY (id, colname)
);
然后您的IN
查询将有效:
cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string1', '01');
cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string2', '02');
cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string3', '03');
cqlsh:ks> select * from stringindice where id = 'rowkey' and colname IN ('string1', 'string2');
id | colname | colvalue
--------+---------+----------
rowkey | string1 | 0x01
rowkey | string2 | 0x02