【问题标题】:Spring Data Neo4j PageableSpring Data Neo4j 可分页
【发布时间】:2014-01-01 02:42:59
【问题描述】:

我有一个 Spring Data Repository 接口,它使用自定义查询从数据库中获取节点集合:

存储方法:

@Query ("START r = node({0}) MATCH r <-[:AUTHOR]-  m RETURN m")
public Page<Object> findObjectById (long objectId,Pageable pageable);

方法调用

 custRepository.findObjectById (4,new PageRequest(0, 5));

这会返回一个对象集合,但是页面信息不正确。数据库中有足够的数据让我获取几页数据。第一个Page信息是说有:

 Current Page #: 0
 Total Pages: 1
 Is First Page: true
 Is last Page: true

但是,当我获取第二页时,我仍然得到其他对象的集合,然后页面信息变为:

 Current Page #: 1
 Total Pages: 6
 Is First Page: false
 Is last Page: false

这清楚地表明第一页上的页面信息不正确,因为我需要准确的信息来在我的应用程序中实现分页,这成为一个问题。是什么导致了这个问题,我该如何解决?

【问题讨论】:

    标签: java pagination spring-data spring-data-neo4j


    【解决方案1】:

    我遇到了同样的问题。事实证明,您还必须指定查询注释的 countQuery 属性。不确定它是否是一个错误或没有很好的记录。在你的情况下应该是

    @Query (value="START r = node({0}) MATCH r <-[:AUTHOR]-  m RETURN m", 
            countQuery="START r = node({0}) MATCH r <-[:AUTHOR]-m RETURN count(m)")
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,经过一些研究,我在 org.springframework.data.neo4j.repository.query.GraphRepositoryQuery 类中发现了一个错误

      以下方法是问题

      @SuppressWarnings({"unchecked", "rawtypes"})
      protected Object createPage(Iterable<?> result, Pageable pageable, Long count) {
          final List resultList = IteratorUtil.addToCollection(result, new ArrayList());
          if (pageable==null) {
              return new PageImpl(resultList);
          }
          long currentTotal;
          if (count!=null) {
              currentTotal = count;
          } else {
              int pageSize = pageable.getPageSize();
              long requestedCountStart = pageable.getOffset() * pageSize;
              long resultSize = resultList.size();
              currentTotal = resultSize == pageSize ? requestedCountStart + pageSize : requestedCountStart+resultSize;
          }
          return new PageImpl(resultList, pageable, currentTotal);
      }
      

      特别是那些行:

              int pageSize = pageable.getPageSize();
              long requestedCountStart = pageable.getOffset() * pageSize;
      

      转换为 requestedCountStart = page * size * size

      有谁知道提交 Neo4j 错误报告的最佳地点在哪里?

      顺便说一句,我使用的是 spring-data-neo4j 版本 3.0.0.RELEASE

      【讨论】:

      【解决方案3】:

      试试这个对我有用

      添加页面参数如下

      parameters.put("page", pageable.getPageNumber() * pageable.getPageSize());
      parameters.put("size", pageable.getPageSize());
      

      并在您的查询中附加SKIP $page LIMIT $size

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 2015-08-17
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多