日期:2014-05-19  浏览次数:20678 次

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 ...而且是对本表,所以应该是自治事务才行。。自己可以看看。