2017-03-15 1 views
0

Spring Data Cassandra 1.5.0 est livré avec une API de streaming dans CassandraTemplate. J'utilise spring-data-cassandra 1.5.1. J'ai un code comme:Comment diffuser Sélectionnez les résultats (pas les résultats de la requête String) à partir de CassandraOperations?

String tableName = cassandraTemplate.getTableName(MyEntity.class).toCql(); 
    Select select = QueryBuilder.select() 
      .all() 
      .from(tableName); 
    // In real world, WHERE statement is much more complex 
    select.where(eq(ENTITY_FIELD_NAME, expectedField)) 
    List<MyEntity> result = cassandraTemplate.select(select, MyEntity.class); 

et que vous souhaitez remplacer ce code avec itérables ou Java 8 flux afin d'éviter la récupération d'une grande liste de résultats à la mémoire à la fois. Ce que je cherche est une signature de méthode comme CassandraOperations.stream(Select query, Class<T> entityClass), mais elle n'est pas disponible.

La seule méthode disponible dans CassandraOperations accepte la chaîne de requête: stream(String query, Class<T> entityClass). J'ai essayé de passer ici une chaîne générée par Select comme

cassandraTemplate.stream(select.getQueryString(), MyEntity.class) 

Mais qui ne réussit pas avec InvalidQueryException: Invalid amount of bind variables, parce que getQueryString() retourne la requête avec des marques de positionnement question au lieu des variables.

Je vois 3 options pour obtenir ce que je veux, mais toutes les options semble mauvais:

Existe-t-il un meilleur moyen de diffuser les résultats de la sélection?

Merci.

+0

En ce moment, 'stream' accepte que les requêtes' CHAINE'. Vous pouvez jeter un oeil à '2.0.0.BUILD-SNAPSHOT' qui étend' stream' pour accepter 'Statement'. Alternativement: Avez-vous essayé de créer un référentiel pour 'MyEntity' déclarant une méthode' Stream findByFooAndBar (Chaîne foo, Chaîne de caractères) '? Fonctionne également avec '@Query (" ... ")'. – mp911de

+0

@ mp911de, oui, en fait j'écris un repository personnalisé impl avec la méthode qui retourne Stream. Mais encore une fois, dans cette méthode j'utilise CassandraOperations qui ne permet pas de passer l'objet Select dans la méthode stream(). – Dmitriusan

+0

Vous n'êtes pas obligé de créer un implem personnalisé car Spring Data Cassandra prend en charge le retour de Stream (à partir de la version 1.5). Toute la gestion des requêtes/la liaison des paramètres est gérée par l'implémentation du référentiel par défaut. – mp911de

Répondre