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:
- Utiliser le mécanisme de création de requêtes Spring avec le type de rendement attendu flux/Iterator (bien que pour les requêtes simples) http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#repositories.query-methods.query-creation
- d'utilisation requête CQL premières et de ne pas utiliser
QueryBuilder
- Appel
select.getQueryString()
puis paramètres de substitution à nouveau par l'intermédiaireBoundStatement
Existe-t-il un meilleur moyen de diffuser les résultats de la sélection?
Merci.
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
@ 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
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