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