You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDN 5 OGM Neo4j分页查询结果数量异常问题求助

问题原因分析
  1. 结果数量超标的核心原因:你的自定义查询返回了u、ruru、ru三个元素,SDN OGM会将所有返回的节点(包括ru对应的User实体)都纳入结果列表。比如当某个用户的推荐人ru本身不在当前分页的u集合中时,ru会被额外计入结果,导致返回数量超过分页限制。
  2. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:35:18