如何从 CassandraOperations 流式传输 Select 结果(不是字符串查询结果)?
How to stream Select results (not String query results) from CassandraOperations?
Spring Data Cassandra 1.5.0 在 CassandraTemplate 中附带了一个流 API。我正在使用 spring-data-cassandra
1.5.1。我有这样的代码:
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);
并想用 iterable 或 Java 8 Stream 替换此代码,以避免一次将大量结果列表提取到内存中。
我要找的是像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() returns 查询使用问号占位符而不是变量。
我看到 3 个选项可以得到我想要的,但每个选项看起来都不好:
- 使用 Spring 查询创建机制 Stream/Iterator 预期 return 类型(仅适用于简单查询)http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#repositories.query-methods.query-creation
- 使用原始 CQL 查询而不使用
QueryBuilder
- 调用
select.getQueryString()
然后通过BoundStatement
再次替换参数
是否有更好的方式来流式传输选择结果?
谢谢。
所以,到目前为止,我的问题的答案是等到 spring-data-cassandra
2.0.0
的稳定版本出来:
Spring Data Cassandra 1.5.0 在 CassandraTemplate 中附带了一个流 API。我正在使用 spring-data-cassandra
1.5.1。我有这样的代码:
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);
并想用 iterable 或 Java 8 Stream 替换此代码,以避免一次将大量结果列表提取到内存中。
我要找的是像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() returns 查询使用问号占位符而不是变量。
我看到 3 个选项可以得到我想要的,但每个选项看起来都不好:
- 使用 Spring 查询创建机制 Stream/Iterator 预期 return 类型(仅适用于简单查询)http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#repositories.query-methods.query-creation
- 使用原始 CQL 查询而不使用
QueryBuilder
- 调用
select.getQueryString()
然后通过BoundStatement
再次替换参数
是否有更好的方式来流式传输选择结果?
谢谢。
所以,到目前为止,我的问题的答案是等到 spring-data-cassandra
2.0.0
的稳定版本出来: