SDN 5 OGM Neo4j分页查询结果数量异常问题求助
问题原因分析
- 结果数量超标的核心原因:你的自定义查询返回了
u、ruru、ru三个元素,SDN OGM会将所有返回的节点(包括ru对应的User实体)都纳入结果列表。比如当某个用户的推荐人ru本身不在当前分页的u集合中时,ru会被额外计入结果,导致返回数量超过分页限制。 - 关于
referrerUser的属性类型:你的实体定义是正确的——private User referrerUser已经是单个实体属性,而非集合,不需要额外设置。
修复方案
方案一:简化查询,依赖OGM自动加载关系
直接让查询仅返回User节点,SDN OGM会根据实体上的@Relationship注解自动加载推荐人关系,同时分页逻辑会准确作用在User节点数量上:
@Query(value = "MATCH (u:User) RETURN u", countQuery = "MATCH (u:User) RETURN count(u)") Page<User> findUsers(Pageable pageable);
同时修正分页排序字段(对应实体属性名,而非查询别名):
Pageable pageable = PageRequest.of(0, 50, Sort.by(Sort.Direction.DESC, "createdAt"));
方案二:手动关联关系并确保分页准确性
如果需要避免N+1查询,可先分页筛选User节点,再关联推荐人关系,用collect聚合结果确保每个User仅对应一行返回:
@Query(value = "MATCH (u:User) " + "ORDER BY u.createdAt DESC SKIP $skip LIMIT $limit " + "OPTIONAL MATCH (u)-[ruru:REFERRED_BY]->(ru:User) " + "RETURN u, collect(ruru), collect(ru)", countQuery = "MATCH (u:User) RETURN count(u)") Page<User> findUsers(Pageable pageable);
方案三:使用SDN衍生查询(最简洁)
无需自定义查询,直接使用Spring Data的衍生方法,SDN会自动生成正确的分页、排序和关系加载逻辑:
Page<User> findAll(Pageable pageable);
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

