关于Hibernate查询出现重复数据的问题和解决方案

首先我说明一下我遇到的情况,以便正在阅读本文的你可以决定是否需要继续看下去:

假设我有一张表,里面有4个字段,分别叫做ABCD,主键是A,对应的我有一个pojo和一个hbm文件,pojo没什么,hbm文件里的<id>标签对应的却是B(也许你说怎么会有这种情况,其实实际情况是我在一个视图里遇到的这个问题,那里可不只有4个字段,我这么写是希望你能最快的理解).

好的,现在问题来了.....我使用了B作为条件查询了这张表,姑且我们定义这个条件为B=1,我的表里符合这个条件的数据有2条,当然它们的A字段的值是不同的(一个A=1,一个A=2),查询的结果是:两条一模一样的数据(也就是两条都是A=1或者A=2).

前面我描述了问题的现象,如果你遇到的和我一样,你可以继续看下去,或许你已经在我上面的描述里看出了问题所在.是的,就是因为hbm里的主键设置,由于<id>设置成了不唯一字段,而Hibernate认为它是唯一的,导致了查询出的两条数据有相同的B字段的值时,Hibernate直接复用了第一条查出的数据,因为它认为第二条既然主键都相同了,那其它的也一定一样.

原因既然解释了,解决方案就是:

1.找出你这个实体真正的唯一字段,将其标记为<id>(切记将<id>这个标签放在hbm文件其他<property>之前,否则...你肯定会这么做的)

2.使用联合主键,这个我没试,网上例子也很多,搜索一下Hibernate联合主键,你就有答案了.

好了,如果本文对你有些帮助,就在下面回复一下,让我知道我写的东西没有白费.或者你有什么问题,也可以留下.

拒做伸手党,从我做起!

时间: 2024-10-27 06:43:52

关于Hibernate查询出现重复数据的问题和解决方案的相关文章

sql查询删除重复数据

数据库UserInfo 删除重复数据 即删除重复的用户名手机号 同一个用户名手机号只保留一个用户 01.根据多个字段查询重复数据 with data1 as( select MobilePhone,Name from UserInfogroup by MobilePhone,Namehaving count(*)>1 ), 02.对重复数据分配编号 data2 as ( select u.*,row_number() over(partition by u.MobilePhone,u.Name

SQL 查询不重复数据

sql不重复的查找统计数据2007-06-29 11:04例表如下: 表名:MYTEST TID    COL1    COL2     COL3 1           1           A            A 2           1           A            A 3           2           A            A 4           2           B            A 5           3       

springboot JPA 一对多关联查询 ,动态复杂查询 去除重复数据 in语句使用

目的:根据图书的发布地区查询图书信息实现步骤:1 实体配置one: 图书信息 bookmany: 地区信息 bookarea实体映射,单向映射 book 中增加 area 的集合 并设置 @JoinColumn(name="bookid")@OneToMany bookarea中不需要设置关系 编写查询语句Repository 继承 JpaSpecificationExecutor 重写findAll 并实现 Specification接口的 public Predicate toPr

[技术分享]20171214_oracle_带rownum的查询语句查询出重复数据:原因是order by没有加主键

原始的sql是这样的: select * from( select tmp.*,rownum rn from( select * from table1 where column1 ='12345' order by column2,column3 desc ) tmp where rownum<=30 ) where rn>20 问题:在我的项目中,当rownum<=20 , rn>10的数据和rownum<=30 , rn>20的数据一样. 解决办法:后来在orde

Hibernate查询多个数据

Query query = session.createQuery("from Table");//表名首字母大写 query.setFirstResult(0); //从第一个开始查 query.setMaxResults(10);//查10个 List list=query.list();//得到list 若是对象的list则写成List list <Table>=query.list();

sql查询不重复数据

SELECT * FROM user WHERE Uid IN ( select min(Uid) from user group by Sid ) 原文地址:https://www.cnblogs.com/gjack/p/10326651.html

oracle学习----去除表中的重复数据

重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种:两行记录完全一样.第一.对于部分字段重复数据的删除        先来谈谈如何查询重复的数据吧.        下面语句可以查询出那些数据是重复的:select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1        将上面的>号改为=号就可以查询出没有重复的数据了.        想要删除这些重复的数据,可以使用下面语句进行删除delete f

数据库删除重复数据 sql

delete from `user`where id in( SELECT * from(select id from `user` WHERE id not in (select min(id) from `user` group by names having count(names)>1) ) tep) 红色为查询出重复数据的id作为要删除的数据条件 原文地址:https://www.cnblogs.com/libiao-libar/p/9744700.html

查询和删除表中重复数据sql语句

  1.查询表中重复数据.select * from peoplewhere peopleId in (select   peopleId   from   people   group   by   peopleId   having   count(peopleId) > 1)2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where peopleId   in (select   peopleId