【发布时间】:2014-09-14 21:02:20
【问题描述】:
我目前正在使用官方 Datastax 驱动程序 (V2.0) 编写一个非常基本的 CQL 访问层,并且在将参数值传递给语句时遇到了一些困难。
这是一个例子
列族(简化)
USE myKeyspace;
CREATE TABLE MyTable (
myId timeuuid,
myTypeId int,
myVal varchar,
PRIMARY_KEY( myId, myTypeId )
);
CREATE INDEX MyTable_myTypeID
ON MyTable( myTypeId );
基本思想是存储一些具有多个值的事件数据(每个“事件”),这就是我使用组合 PK 的原因。每个事件都有其基于时间的 UUID,每个 typeId 可能有多个条目。 从建模的角度来看,这是否有意义?
我现在要做的是仅获取具有“typeIds”选择的事件的条目。
public void myQueryCode() {
Cluster.Builder builder = Cluster.builder();
builder.withPort( 9142 );
builder.addContactPoints( "127.0.0.1" );
cluster = builder.build();
Session session = cluster.connect( "myKeyspace" );
List<Integer> typeFilter = new ArrayList<> ();
typeFilter.add( 1 );
typeFilter.add( 2 );
Statement stmt = new SimpleStatement(
"SELECT * FROM MyTable where myId = ?" +
" AND myTypeId IN (?,?)" +
" ALLOW FILTERING",
UUID.randomUUID(),
typeFilter );
ResultSet result = session.execute( stmt );
// do something with results
}
但是,我只是在语句值的序列化中遇到了一个异常。
com.datastax.driver.core.exceptions.InvalidQueryException: Expected 4 or 0 byte int (8)
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:256)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:172)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
我不确定是否将列表作为第二个参数传递,驱动程序正在使用该参数,但也许这仅适用于集合类型列上的插入?
【问题讨论】: