현재 공식 Datastax 드라이버 (V2.0)를 사용하여 매우 기본적인 CQL 액세스 계층을 작성 중이며 매개 변수 값을 전달하는 데 어려움을 겪고 있습니다.cassandra-driver-core : 목록 화 된 값을 매개 변수화 된 SimpleStatement에 전달합니다.
여기
열 가족 (간체) 예를 들어
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
}
그러나 Statement 값의 serialization에서 예외가 발생했습니다.
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)
나는, 드라이버가 매개 변수를 취하고 두 번째 매개 변수로 목록을 전달에 잘 모르겠어요,하지만 어쩌면 그 컬렉션 타입 컬럼에 삽입에만 적합?
필자가 생각하기에, 다양한 type 필터 목록 길이를 처리 할 때 까다로운 일이 생길 수 있습니다. 그런 다음 모든 쿼리 매개 변수 값을 Object 배열에 넣고 매개 변수 목록으로 SimpleQuery에 전달해야합니다 (원래 코드는 자리 표시 자/와일드 카드 수를 조정합니다. 그러나 인덱스 또는 별칭 기반 매개 변수 처리 및 유형별 setter를 사용하는 전통적인 PreparedStatement처럼 처리하는 BoundStatement를 사용하는 것이 더 좋습니다. 유일한 문제는 남아 있습니다 : 나는 PK에 타입을 가지고 싶습니다만, Cassandra 2.0은 PK 컬럼의 "IN"절을 지원하지 않습니다. – DoNuT