Spring Data Neo4j 分页查询功能

3
我有一个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));

这段话的意思是:“这会返回一个对象集合,但页面信息不正确。数据库中有足够的数据可以让我获取多个数据页面。第一页的信息显示:”
 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

这明显表明第一页的页面信息是错误的,由于我需要准确的信息来实现我的应用程序中的分页,所以这成为了一个问题。是什么导致了这个问题,我该如何解决它?
3个回答

4

我遇到了同样的问题。原来你还需要指定查询注释的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)")

希望能帮到您。

1
我遇到了同样的问题,并经过一些研究,发现了org.springframework.data.neo4j.repository.query.GraphRepositoryQuery类中的一个bug。
以下方法是有问题的:
@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。


您可以在此处提交问题 https://jira.spring.io/browse/DATAGRAPH/?selectedTab=com.atlassian.jira.jira-projects-plugin:issues-panel - Stephane

0

我试过这个方法有效

添加以下页面参数

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

在你的查询中添加 SKIP $page LIMIT $size

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接