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

Spring Repository原生SQL查询返回JSON数据重复问题求助

解决JSON响应数据重复问题

可能原因及对应解决方案

1. 数据库关联表存在重复记录

先排查tc_usuario_asesores表是否有重复的用户-顾问关联记录,执行以下SQL验证:

SELECT userid, asesorid, COUNT(*) 
FROM tc_usuario_asesores 
GROUP BY userid, asesorid 
HAVING COUNT(*) > 1;

如果返回结果,说明存在重复关联,直接清理这些重复数据即可解决根源问题。

2. 实体类映射/序列化问题

如果你的Repository方法返回的是实体类(如User、Asesor)而非自定义数据传输对象(DTO),可能因为实体间的双向关联导致Jackson序列化时重复输出,或是实体的equals/hashCode方法未正确实现导致集合去重失效。

解决方案:使用自定义DTO接收查询结果
创建一个仅包含所需字段的DTO类:

public class UserAsesorDTO {
    private Long userid;
    private String cliente;
    private String nombre;
    private String correo;
    private String telefono;
    private String asesoria;

    // 注意:构造器参数顺序必须与SQL查询返回的列顺序完全一致
    public UserAsesorDTO(Long userid, String cliente, String nombre, String correo, String telefono, String asesoria) {
        this.userid = userid;
        this.cliente = cliente;
        this.nombre = nombre;
        this.correo = correo;
        this.telefono = telefono;
        this.asesoria = asesoria;
    }

    // 生成所有字段的Getter方法
}

修改Repository方法的返回类型为该DTO:

@Query( value = "SELECT U.id as userid, u.name as cliente," +
"A.nombre, A.correo, A.telefono, TA.tipo as asesoria " +
"from tc_users U, tc_usuario_asesores UA , " +
"tc_asesor A,tc_tip_asesor TA " +
"where U.id = UA.userid " +
"and UA.asesorid= A.id " +
"and A.tipo_asesor = TA.id",
 nativeQuery = true)
List<UserAsesorDTO> getUserAsesorData();

3. 查询结果存在业务允许的重复

如果业务上允许同一用户-顾问组合出现多次,但你需要在响应中去重,可在SQL中添加DISTINCT关键字:

@Query( value = "SELECT DISTINCT U.id as userid, u.name as cliente," +
"A.nombre, A.correo, A.telefono, TA.tipo as asesoria " +
"from tc_users U, tc_usuario_asesores UA , " +
"tc_asesor A,tc_tip_asesor TA " +
"where U.id = UA.userid " +
"and UA.asesorid= A.id " +
"and A.tipo_asesor = TA.id",
 nativeQuery = true)
List<UserAsesorDTO> getUserAsesorData();

4. 循环引用导致的序列化重复

如果实体类存在双向关联(如User包含List<Asesor>,Asesor又包含User),Jackson序列化时会出现循环引用,进而产生重复数据。此时可在关联字段上添加@JsonIgnore注解,或使用@JsonManagedReference和@JsonBackReference标记双向关联:

// 在User类的asesors字段上添加
@JsonManagedReference
private List<Asesor> asesors;

// 在Asesor类的user字段上添加
@JsonBackReference
private User user;

内容的提问来源于stack exchange,提问作者TheShadow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:15:43