2013-06-25 3 views
1

오늘 Astyanax 1.56.42로 마이그레이션하여 준비된 명령문의 withValues ​​()가 과 함께 제대로 작동하지 않는 것으로 나타났습니다. SQL SELECT ... WHERE ... IN). 내 ArrayList에 하나 개 이상의 항목이 포함되어있는 경우Astyanax parepared statement withvalues ​​()가 제대로 작동하지 않습니다.

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(); 

이 내가 뭘 잘못 오류

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

렉션 (ArrayList에)를 공급하고 있기 때문에 당신이 언급 한 바와 같이 예외가 발생합니다. IN 절 안에 넣고 자하는 각 요소에 ?을 추가해야한다고 생각합니다.

당신이 arrayListObj 절라는 ArrayList에 저장된 2 개의 int가하고 싶은 말은, 당신의 문은 다음과 같습니다 : 여러 필요 있도록

SELECT & FROM users WHERE somevalue IN (arrayListObj); 

하면, 모음이 캔트 작업을 납품하고 있기 때문에 ? 님의 답변 나는. 당신이 원하는 : 나는 준비된 문으로 IN 절을 사용하는 방법에 대한 Astyanax wiki에 아무것도 찾을 수 없습니다

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

.

+0

이 해결 방법을 정확하게 수행했습니다. 하지만이 문제를 해결 방법으로 생각합니다. 어쩌면 Netflix는 최근 https://github.com/Netflix/astyanax/pull/360에 명시된대로 동작을 제한 할 수 있습니다. 새 버전이 출시되는대로 바로 사용해 보겠습니다. – Chris