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
相关产品推荐
相关产品推荐

