下記のソースだと、Hibernateでleft joinして、取得したリストの要素が重複していた。
StringBuffer hql = new StringBuffer("");
hql.append(" from Cat as cat left outer join cat.mate as mat ");
Session currentSession = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = currentSession.createQuery(new String(hql));
List<Cat> cats = query.list(); // 重複した要素が取得される。
return cats;
下記のようにHQLの先頭のselectにdistinctをつけると良いみたい。
StringBuffer hql = new StringBuffer(" select distinct cat "); // distinctをつける。
hql.append(" from Cat as cat left outer join cat.mate as mat ");
Session currentSession = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = currentSession.createQuery(new String(hql));
List<Cat> cats = query.list();
return cats;
ちなみにCtiteriaで作成しているときは
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
を指定すると良いみたい。
参考URL
http://stackoverflow.com/questions/14056457/left-join-fetching-duplication