Hibernate查询用户关联Board仅返回1条但数据库有多条记录问题排查
可能原因
- JPQL查询关联字段写错(最高概率)
你当前Repository中写的查询条件是bu.id = :userId,其中bu是BoardUser中间表的实体对象,bu.id对应的是中间表自身的主键值,不是关联的用户ID。你直接操作数据库的SQL大概率用的是中间表的用户ID字段(如user_id)进行过滤,对应正确的JPQL写法应该是bu.user.id = :userId(假设BoardUser实体中关联用户的属性名为user)。中间表主键是唯一的,所以当前写法最多只会返回1条匹配的看板记录。 - Board实体主键映射错误
如果Board实体类中@Id注解错误标注到了非唯一字段上,Hibernate会按照主键值对查询结果自动去重,哪怕数据库返回2条记录,只要主键字段值相同,Hibernate只会保留1个实体对象。 - 额外的过滤逻辑介入
如果项目配置了JPA拦截器、Hibernate过滤器、数据权限切面这类全局逻辑,会在查询执行后自动过滤掉部分结果,直接操作数据库不会触发这类应用层逻辑。 - equals/hashCode方法重写异常
如果Board类重写的equals/hashCode逻辑有问题,导致两条实际不同的看板记录被判定为同一个对象,在JPA上下文处理或者后续流式转换时会被去重。 - 事务隔离级别问题
如果第二条看板数据的新增事务未提交,且接口所在事务的隔离级别为可重复读,接口查询时看不到未提交的数据,而你直接查数据库用的是已提交事务的会话,就会出现两边结果不一致的情况。
内容的提问来源于stack exchange,提问作者mok_1
相关产品推荐
相关产品推荐

