按顺序查错:
一、将hql转化为sql,在数据库中执行。查看是否出现重复
如为重复结果,则说明hql没有问题
若重复结果,则说明hql有问题。则需要重写hql
二、是否存在list()转化后的List集合是不重复的,但你遍历输出的时候,未正确遍历导致每次遍历第一条而出现重复。
解决办法:写个List集合,装入值。测试下遍历输出的东西是否重复。
三、主键问题(新手容易犯的问题)
但查询的表的主键不是由一个字段组成,而是由多个字段组成,即联合主键。此时的实体类未进行配置。不管是使用xml方式还是注解方式,没有进行处理。则结果出来的是重复的。即便你数据库进行了联合主键设置,也是不行的。下面贴出注解方式进行联合主键的配置:
在使用Annotation使用联合主键有三种方式:
1. 将你的多个Primary Key放置一个新类中(主键类),并且用注解@Embeddable 声明主键类即可;实体类使用注解@Id指向主键类
2. 将你的多个Primary Key放置一个新类中(主键类),实体类使用注解@EmbeddedId指向主键类即可;
3. 实体类中在所有需要设置为主键的属性上都加入@Id注解,然后在注解实体类下面添加一个如下注解:
@IdClass(value=XXX.class) 这里的XXX对应你的主键类名
3种之中最适合的书写习惯的是第3种,但是第二种比较方便,也很常用;
但是不管哪一种使用方法,对于使用联合主键而言,你的主键类都需要使用Serializable接口,重写equals和hashCode函数;
Serializable接口 原因是:序列化就是为了能暂存一些对象到硬盘中;
重写equals函数 , 原因是:内存中的对象区分;
重写hashCode 函数, 原因是:根据哈希码快速索引;