2017-03-15 35 views
0

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个选项来获得我想要的东西,但每个选项很糟糕:

有没有更好的方式来流选择结果?

谢谢。

+0

眼下,'stream'只接受'String'查询。你可能想看看'2.0.0.BUILD-SNAPSHOT',它扩展'stream'来接受'Statement'。或者:你是否尝试创建一个'MyEntity'库声明一个方法'流 findByFooAndBar(String foo,String bar)'?也可以使用'@Query(“...”)'。 – mp911de

+0

@ mp911de,是的,其实我正在写一个自定义存储库impl与返回流的方法。但是,在这个方法中,我使用的CassandraOperations不允许将Select对象传递给stream()方法。 – Dmitriusan

+0

因为Spring Data Cassandra支持返回'Stream'(从1.5开始),所以不需要创建自定义repo impl。所有查询处理/参数绑定都由默认存储库实现处理。 – mp911de

回答