2017-01-20 8 views
0

Я работаю с драйвером 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 здесь вообще? Думаю, я должен, потому что я могу установить уровень согласованности?

ответ

2

Как об этом:

public ResultSet executeQuery(final String cql, final Object... values) { 
    return executeWithSession(new SessionCallable<ResultSet>() { 
     @Override 
     public ResultSet executeWithSession(Session session) { 
      BoundStatement bs = getStatement(cql, values); 
      bs.setConsistencyLevel(consistencyLevel); 
      return session.execute(cql); 
     } 
    }); 
} 

// cache the prepared statement 
private BoundStatement getStatement(final String cql, Object... values) { 
    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(values); 
} 
+0

Спасибо Понял. Мне нужен другой метод getStatement для моего первого метода? Поскольку мой первый метод также вызывает этот метод getStatement. – john

+0

О, вы имеете в виду только один метод 'executeQuery'? – john

 Смежные вопросы

  • Нет связанных вопросов^_^