Hibernate一对多双向关系,取一端数据同时抓取多端到Set<E>中,如何避免重复
有两个实体类:Zhu(主)和Cong(从),他们是一对多的关系.如下:
/**
* 主表实体类
*/
public class Zhu {
private int zid;
private String zno;
private String zname;
private Set<Cong> congSet;
......
/**
* 从表实体类
*/
public class Cong {
private int cid;
private String ctype;
private Date cdate;
private Zhu zhu;
......
我现在要从主表中获取每个主表对象的congSet,即多端的Set集合.
怎么解决重复问题?分组还是怎么办?如果分组,以什么字段分组?
我的HQL语句是这样写的:
public List<Zhu> tongZhus() {
//查询用HQL语句
String selectZhus = "from Zhu z join fetch z.congSet";
SessionFactory factory = this.getHibernateTemplate().getSessionFactory();
Session session = factory.openSession();
Query query = session.createQuery(selectZhus);
//
List<Zhu> userList = query.list();
session.close();
//返回Zhu类型的List
return userList;
}
打印测试结果:
工号 姓名
0001 张三
0002 李四
0003 王五
0004 赵六
0001 张三
0002 李四
0003 王五
0004 赵六
Cong表的记录为:
工号 姓名 考勤情况 备注 考勤时间
0001 张三 正常 2010-04-16
0002 李四 正常 2010-04-16
0003 王五 迟到 堵车 2010-04-16
0004 赵六 旷工 失踪 2010-04-16
0001 张三 正常 ****** 2010-04-15
0002 李四 早退 ****** 2010-04-15
0003 王五 迟到 ****** 2010-04-15
0004 赵六 旷工 ****** 2010-04-15
高手说下怎么办?
------解决方案--------------------多的那方 关联 一的那方
------解决方案--------------------写SQL去重复。。。。。。。。。。
------解决方案--------------------这个只有取出来自己处理了。。。
我没想到好办法,至少我觉得HQL没法处理,SQL可以处理,但是有点麻烦
------解决方案--------------------看你的需求,你最后只要工号和姓名两个字段。
Map map = new HashMap();
for(Set<Cong> cong:congSet){
map.put(cong.cid,cong);
}
------解决方案--------------------这个是一个报表了,并且还存在行列转换问题:
不知道你的数据量大不大,数据大建议用SQL
如果不大,哪就取出来,自己算吧
------解决方案--------------------Map map = new HashMap();
for(Set<Cong> cong:congSet){
map.put(cong.cid,cong);
}
map的key就是不重复的员工号
你这个需求虽然简单,但是操作起来有点烦琐
你先自己看看
------解决方案--------------------1.
再往set 中添加时,遍历一下是否存在已有的数据,如果有移除旧的,添加新的。或者不添加。。。
2.
在数据库中做操作。写一个trigger 对insert ...而且是对本表,所以应该是自治事务才行。。自己可以看看。