Я работаю с драйвером Java Datastax для чтения и записи данных в Cassandra. Я использую драйвер datastax java 3.1.0, а моя версия кластера cassandra 2.0.10.Как связать значения с привязанным выражением общим способом с помощью драйвера datastax java?
Я создал ниже два метода для выполнения моего запроса cql.
Я звоню первый метод, когда мне не нужно устанавливать какое-либо значение в моем CQL запросе, так что он работает для CQL строки, как показано ниже:
select * from testkeyspace.testtable where row_id=1 // cql-1
select * from testkeyspace.meta where row_id=1 // cql-2
select * from testkeyspace.proc where row_id=1 // cql-3
Теперь мне нужно вызвать второй метод всякий раз, когда у меня есть запрос как это:
select * from testkeyspace.testtabletwo where row_id=1 and active=? // cql-4
select * from testkeyspace.storage where topic=? and parts=? // cql-5, in this part is Integer and topic is String.
так что мой вопрос, как я могу сделать мой второй метод более универсальным, так что если мне нужно установить п число значений в моем CQL запроса с использованием BoundStatement, он должен работать? Прямо сейчас я не уверен, что я должен делать для cql-4
и cql-5
при вызове моего второго метода со значениями, переданными этому методу? Я знаю, что мне нужно установить эти значения с помощью BoundStatement, но если мне нужно установить два или три или четыре значения, как я могу сделать этот метод общим, чтобы мне не нужно было что-то делать с жестким кодом? Некоторые могут быть целыми, а некоторые могут быть строковыми.
Первый метод: -
public ResultSet executeQuery(final String cql) {
return executeWithSession(new SessionCallable<ResultSet>() {
@Override
public ResultSet executeWithSession(Session session) {
BoundStatement bs = getStatement(cql);
bs.setConsistencyLevel(consistencyLevel);
return session.execute(bs);
}
});
}
Второй метод: -
public ResultSet executeQuery(final String cql, final Object... values) {
return executeWithSession(new SessionCallable<ResultSet>() {
@Override
public ResultSet executeWithSession(Session session) {
BoundStatement bs = getStatement(cql);
bs.setConsistencyLevel(consistencyLevel);
// how to set these **values** into my cql query using BoundStatement in a generic way
// so that I don't need to hardcode anything for cql-4 and cql-5
return session.execute(cql, values);
}
});
}
// cache the prepared statement
private BoundStatement getStatement(final String cql) {
Session session = getSession();
PreparedStatement ps = cache.get(cql);
// no statement cached, create one and cache it now.
if (ps == null) {
ps = session.prepare(cql);
PreparedStatement old = cache.putIfAbsent(cql, ps);
if (old != null)
ps = old;
}
return ps.bind();
}
Должен ли я использовать BoundStatement
здесь вообще? Думаю, я должен, потому что я могу установить уровень согласованности?
Спасибо Понял. Мне нужен другой метод getStatement для моего первого метода? Поскольку мой первый метод также вызывает этот метод getStatement. – john
О, вы имеете в виду только один метод 'executeQuery'? – john