Spring Cloud Spring Cloud Spanner 高级读取
默认情况下,所有读取和查询均为强读取。一个强大的读取
是在当前时间戳的读取,并保证地看到,一直致力于直到这个读开始的所有数据。一个阅读陈旧,另一方面在过去的时间戳被读取。Cloud Spanner允许您确定读取数据时数据的最新程度。使用SpannerTemplate
,您可以通过将SpannerQueryOptions
或SpannerReadOptions
上的Timestamp
设置为适当的读取或查询方法来指定:
读:
// a read with options: SpannerReadOptions spannerReadOptions = new SpannerReadOptions().setTimestamp(Timestamp.now()); List<Trade> trades = this.spannerTemplate.readAll(Trade.class, spannerReadOptions);
查询:
// a query with options: SpannerQueryOptions spannerQueryOptions = new SpannerQueryOptions().setTimestamp(Timestamp.now()); List<Trade> trades = this.spannerTemplate.query(Trade.class, Statement.of("SELECT * FROM trades"), spannerQueryOptions);
可以通过模板API 使用辅助索引进行读取,也可以通过SQL for Queries隐式使用 辅助索引 。
下面显示了如何通过在SpannerReadOptions
上设置index
来使用二级索引从表中读取行:
SpannerReadOptions spannerReadOptions = new SpannerReadOptions().setIndex("TradesByTrader"); List<Trade> trades = this.spannerTemplate.readAll(Trade.class, spannerReadOptions);
限制和偏移量仅受查询支持。以下将仅获取查询的前两行:
SpannerQueryOptions spannerQueryOptions = new SpannerQueryOptions().setLimit(2).setOffset(3); List<Trade> trades = this.spannerTemplate.query(Trade.class, Statement.of("SELECT * FROM trades"), spannerQueryOptions);
请注意,以上等效于执行SELECT * FROM trades LIMIT 2 OFFSET 3
。
按键读取不支持排序。但是,对Template API的查询支持通过标准SQL以及Spring Data Sort API进行排序:
List<Trade> trades = this.spannerTemplate.queryAll(Trade.class, Sort.by("action"));
如果提供的排序字段名称是域类型属性的名称,则将在查询中使用与该属性对应的列名称。否则,假定给定的字段名称是Cloud Spanner表中列的名称。可以忽略大小写,对Cloud Spanner类型STRING和BYTES的列进行排序:
Sort.by(Order.desc("action").ignoreCase())
仅在使用查询时才可以进行部分读取。如果查询返回的行的列少于要映射到的实体的列,则Spring Data将仅映射返回的列。此设置也适用于嵌套结构及其相应的嵌套POJO属性。
List<Trade> trades = this.spannerTemplate.query(Trade.class, Statement.of("SELECT action, symbol FROM trades"), new SpannerQueryOptions().setAllowMissingResultSetColumns(true));
如果设置设置为false
,则查询结果中缺少列时将引发异常。
更多建议: