该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用Spring Data Neo4j 8.0.0spring-doc.cadn.net.cn

滚动

滚动是一种更细粒度的方法,用于遍历较大的结果集块。滚动包括稳定排序、一种滚动类型(基于偏移或键集滚动)和结果限制。您可以通过使用属性名称定义简单的排序表达式,并通过返回页首第一关键词通过查询推导。你可以将表达式串接起来,将多个条件汇集成一个表达式。spring-doc.cadn.net.cn

滚动查询返回窗<T>这使得可以获得该元素的滚动位置以获取下一个窗<T>直到你的应用消耗了整个查询结果。类似于消耗 Java迭代器<列表<...... >>通过获取下一批结果,查询结果滚动可以访问 a卷轴位置通过Window.positionAt(...),如下例所示:spring-doc.cadn.net.cn

Window<User> users = repository.findFirst10ByLastnameOrderByFirstname("Doe", ScrollPosition.offset());
do {

  for (User u : users) {
    // consume the user
  }

  if (users.isLast() || users.isEmpty()) {
    break;
  }

  // obtain the next Scroll
  users = repository.findFirst10ByLastnameOrderByFirstname("Doe", users.positionAt(users.size() - 1));
} while (!users.isEmpty());

卷轴位置将元素的精确位置与整个查询结果区分。查询执行时对位置参数进行排斥处理,结果将从给定位置开始ScrollPosition#offset()ScrollPosition#keyset()作为A的特殊化身卷轴位置表示滚动作的开始。spring-doc.cadn.net.cn

上面的例子展示了静态排序和限制。你也可以定义接受排序对象定义了更复杂的排序顺序,或按请求排序。 以类似的方式,提供限制对象允许你按每个请求定义动态限制,而不是应用静态限制。 在查询方法详情中了解更多关于动态排序和限制的内容。spring-doc.cadn.net.cn

浏览消费实例需要相当多的条件句才能达到最佳的数据库往返,且很快会变成重复性任务,但可以通过以下方式简化WindowIterator.spring-doc.cadn.net.cn

WindowIterator提供了简化滚动的工具通过消除检查下一个存在的需求并应用卷轴位置.spring-doc.cadn.net.cn

WindowIterator<User> users = WindowIterator.of(position -> repository.findFirst10ByLastnameOrderByFirstname("Doe", position))
  .startingAt(ScrollPosition.offset());

while (users.hasNext()) {
  User u = users.next();
  // consume the user
}

使用偏移进行滚动

偏移滚动使用类似于分页的偏移计数器,跳过多个结果,让数据源只返回从给定偏移开始的结果。 这一简单机制避免了向客户端应用程序发送大量结果。 然而,大多数数据库需要先实现完整的查询结果,服务器才能返回结果。spring-doc.cadn.net.cn

例子1。用偏移滚动位置使用仓库查询方法
interface UserRepository extends Repository<User, Long> {

  Window<User> findFirst10ByLastnameOrderByFirstname(String lastname, OffsetScrollPosition position);
}

WindowIterator<User> users = WindowIterator.of(position -> repository.findFirst10ByLastnameOrderByFirstname("Doe", position))
  .startingAt(OffsetScrollPosition.initial()); (1)
1 从不偏移开始,以包含位置元素0.

两者之间是有区别的ScrollPosition.offset()ScrollPosition.offset(0L). 前者表示滚动作的开始,指向无特定偏移量,而后者则标识第一个元素(位置)0)结果的。 鉴于滚动的排他性,使用ScrollPosition.offset(0)跳过第一个元素,并转换为1.spring-doc.cadn.net.cn

使用键集过滤进行滚动

基于偏移量的数据库要求大多数数据库必须先实现整个结果,服务器才能返回结果。 所以客户端只看到请求结果的部分,而服务器需要构建完整结果,这会增加负载。spring-doc.cadn.net.cn

键集过滤通过利用数据库内置功能实现结果子集检索,旨在减少单个查询的计算和输入输出需求。 这种方法通过将键传递到查询中,维持一组键来恢复滚动,从而有效修改你的筛选条件。spring-doc.cadn.net.cn

键集过滤的核心思想是开始使用稳定的排序顺序检索结果。 一旦你想滚动到下一个区块,你会得到一个卷轴位置用于重建排序结果中的位置。 这卷轴位置捕获当前中最后一个实体的密钥集. 为了运行查询,重建会重写条件子句,包含所有排序字段和主键,以便数据库利用潜在索引来执行查询。 数据库只需从给定的键集位置构建一个更小的结果,无需完全实现一个大结果,然后跳过结果直到达到特定偏移量。spring-doc.cadn.net.cn

Keyset-Filtering 要求密钥集属性(用于排序的属性)必须是不可空的。 这个限制是因为具体商店的规定比较算子的值处理以及对索引源执行查询的需求。 对可空属性进行键集过滤会导致意想不到的结果。spring-doc.cadn.net.cn

KeysetScrollPosition(关键集滚动位置)使用仓库查询方法
interface UserRepository extends Repository<User, Long> {

  Window<User> findFirst10ByLastnameOrderByFirstname(String lastname, KeysetScrollPosition position);
}

WindowIterator<User> users = WindowIterator.of(position -> repository.findFirst10ByLastnameOrderByFirstname("Doe", position))
  .startingAt(ScrollPosition.keyset()); (1)
1 从最开始的步骤开始,不要进行额外的过滤。

当数据库包含与排序字段匹配的索引时,键集过滤效果最佳,因此静态排序效果良好。 应用键集过滤的滚动查询要求查询返回排序顺序中使用的属性,这些属性必须映射到返回的实体中。spring-doc.cadn.net.cn

你可以使用接口投影和DTO投影,但一定要包含所有你排序过的属性,以避免密钥集提取失败。spring-doc.cadn.net.cn

在指定你的排序顺序,只需包含与查询相关的排序属性即可; 如果你不想确保独特的查询结果,也不必如此。 键集查询机制通过包含主键(或复合主键的剩余部分)来调整排序顺序,确保每个查询结果都是唯一的。spring-doc.cadn.net.cn