Spring Data Cassandra 1.5.0在CassandraTemplate中提供了流式API。我正在使用spring-data-cassandra
1.5.1。我有这样一个代码:如何流从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);
,并希望将这段代码与迭代或者Java 8流,以避免一次取结果存储的大名单。
我在找的是一种方法签名,如CassandraOperations.stream(Select query, Class<T> entityClass)
,但它不可用。
CassandraOperations
中唯一可用的方法接受查询字符串:stream(String query, Class<T> entityClass)
。我想在这里路过Select
生成的字符串像
cassandraTemplate.stream(select.getQueryString(), MyEntity.class)
但是失败InvalidQueryException: Invalid amount of bind variables
,因为getQueryString()返回问号占位符代替变量查询。
我看到3个选项来获得我想要的东西,但每个选项很糟糕:
- 使用Spring创建查询机制(仅用于简单的查询好)流/迭代器的预期收益类型http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#repositories.query-methods.query-creation
- 使用原CQL查询,而不是通过再
select.getQueryString()
,然后替代参数使用QueryBuilder
- 呼叫
BoundStatement
有没有更好的方式来流选择结果?
谢谢。
眼下,'stream'只接受'String'查询。你可能想看看'2.0.0.BUILD-SNAPSHOT',它扩展'stream'来接受'Statement'。或者:你是否尝试创建一个'MyEntity'库声明一个方法'流 findByFooAndBar(String foo,String bar)'?也可以使用'@Query(“...”)'。 –
mp911de
@ mp911de,是的,其实我正在写一个自定义存储库impl与返回流的方法。但是,在这个方法中,我使用的CassandraOperations不允许将Select对象传递给stream()方法。 – Dmitriusan
因为Spring Data Cassandra支持返回'Stream'(从1.5开始),所以不需要创建自定义repo impl。所有查询处理/参数绑定都由默认存储库实现处理。 – mp911de