Edited at

Hibernateでleft joinを行おうとした際に重複したインスタンスが現れる対処法

More than 5 years have passed since last update.

下記のソースだと、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