Hibernate查询MySQL视图结果数正确但所有行数据重复是什么原因
问题根因
该异常是JPA实体主键映射错误+一级缓存复用机制共同导致的:
- JPA要求每个
@Entity实体必须有唯一主键(@Id标注的字段),持久化上下文(一级缓存)会以主键值为key缓存已经查询到的实体对象 - 你当前的
UserInfoView实体将userUUID作为唯一主键,但你查询的4条结果的userUUID值全部都是UUID1,属于重复主键值 - JPA执行查询时,第一条结果映射为实体对象后会存入一级缓存,后续3条结果检测到主键值和缓存中已有的
UUID1完全一致,就会直接复用缓存中的第一个对象,不会重新映射新的字段值,最终返回的4个对象全是第一行数据的拷贝。
解决方案
方案1:修改视图和实体,使用唯一字段作为主键(最推荐)
你现有视图关联的USER表的id字段是全局唯一的,调整视图SQL把这个字段加进去:
CREATE OR REPLACE VIEW USER_INFO_VIEW AS SELECT u.ID AS USER_RECORD_ID, -- 新增USER表的唯一主键字段 u.USER_UUID, u.NAME, a.ADDRESS FROM USER u JOIN ADDRESS a ON a.ID = u.ADDRESS_ID
然后调整实体类的主键映射:
@Entity @Immutable @Table(name = "user_info_view") public class UserInfoView implements Serializable { @Id @Column(name = "user_record_id") private Long userRecordId; // 改用唯一的USER表ID作为主键 @Column(name = "user_uuid") private String userUUID; @Column(name = "name") private String name; @Column(name = "address") private String address; // 省略getter、setter等 }
这个方案从根源符合JPA的实体设计规范,后续不会出现缓存复用异常。
方案2:使用复合主键
如果无法修改视图结构,可以将多个能唯一标识一行的字段组合为复合主键:
- 先定义复合主键类,实现
Serializable接口,重写equals和hashCode方法
public class UserInfoViewId implements Serializable { private String userUUID; private String name; private String address; // 重写equals、hashCode、构造方法 }
- 实体类用
@IdClass标注,对应字段都加@Id
@Entity @Immutable @IdClass(UserInfoViewId.class) @Table(name = "user_info_view") public class UserInfoView implements Serializable { @Id @Column(name = "user_uuid") private String userUUID; @Id @Column(name = "name") private String name; @Id @Column(name = "address") private String address; // 省略其余字段、getter、setter等 }
方案3:临时禁用查询缓存(不推荐,仅应急使用)
如果暂时无法修改实体和视图,可以在查询方法上添加查询提示,禁用缓存复用:
@Repository public interface UserInfoViewRepository extends JpaRepository<UserInfoView, String> { @QueryHints(value = { @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"), @QueryHint(name = "hibernate.cache.use_second_level_cache", value = "false") }) List<UserInfoView> findAllByUserUUID(String userUUID); }
该方案没有解决主键设计错误的根本问题,后续其他查询场景仍可能触发相同异常。
内容的提问来源于stack exchange,提问作者hc0re
相关产品推荐
相关产品推荐

