2017-01-20 1 views
0

Je travaille avec le pilote Java Datastax pour lire et écrire des données dans Cassandra. J'utilise le pilote datastax java 3.1.0 et ma version de cluster Cassandra est 2.0.10.Comment lier des valeurs à une instruction liée de manière générique en utilisant le pilote java dataastax?

J'ai créé ci-dessous deux méthodes pour exécuter ma requête cql.

Je fais appel première méthode quand je ne ai pas besoin de mettre une valeur dans ma requête CQL il travaille pour la chaîne de cql comme ci-dessous:

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 

Maintenant je dois appeler la deuxième méthode chaque fois que j'ai requête comme ceci:

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. 

alors ma question est de savoir comment puis-je faire ma deuxième méthode plus générique de telle sorte que si je dois définir le nombre n de valeurs dans ma requête CQL en utilisant BoundStatement, il devrait fonctionner? En ce moment je ne suis pas sûr de ce que je suis censé faire pour cql-4 et cql-5 en appelant ma deuxième méthode avec des valeurs passées à cette méthode? Je sais que je dois définir ces valeurs en utilisant BoundStatement mais si j'ai besoin de définir deux, trois ou quatre valeurs, comment puis-je rendre cette méthode générique pour que je n'aie pas besoin de coder en dur? Certains peuvent être Integer et certains peuvent être String.

Première méthode: -

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

Deuxième méthode: -

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

Dois-je utiliser BoundStatement tout ici? Je suppose que je dois parce que c'est ainsi que je peux définir le niveau de cohérence?

Répondre

2

Que diriez-vous que:

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

Merci a obtenu. Ai-je besoin d'une autre méthode 'getStatement' pour ma première méthode? Depuis ma première méthode appelle également cette méthode getStatement. – john

+0

Ohh vous voulez juste avoir une méthode 'executeQuery'? – john