Spring Data Neo4j可分页

时间:2013-12-13 10:49:59

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

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

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

我遇到了同样的问题,经过一些研究后我在课堂上发现了一个bug 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提交错误报告的最佳位置在哪里?

BTW我使用的是spring-data-neo4j版本3.0.0.RELEASE