我的Group
s包含GroupElement
的问题。
例如,使用此数据:
我尝试列出Group
,并期望每个Group
获得2 GroupElement
个Group
。
相反,每个Group
都是重复的。我实际上获得了6 Group
:
我的猜测是,每个Group
都会重建GroupElement
。
我搜索了SO,发现问题可能来自equals()/hashCode()
定义或写入请求的方式,所以我给你们两个。
我有这个映射:
@Entity
@Table(name = "xxx")
public class Group {
...
@JsonBackReference
@OneToMany(mappedBy = "group")
private List<GroupElement> groupElements = Lists.newArrayList();
//Getters & Setters
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || !o.getClass().equals(getClass())) {
return false;
}
return getId() != null && getId().equals(((HasId) o).getId());
}
@Override
public int hashCode() {
return getId() != null ? getId().hashCode() : super.hashCode();
}
}
我请求这样的群组:
public List<Group> listFull() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Group> query = cb.createQuery(Group.class);
Root<Group> group = query.from(Group.class);
group.fetch(Group_.groupElements, JoinType.LEFT);
return em.createQuery(query).getResultList();
}
我可以使用中间Set来修复它,但我问这个问题是为了找到更好的解决方案。
答案 0 :(得分:3)
将ResultTransformer设置为你(Hibernate)标准,你将得到没有重复的结果:
Session session = getSession();
Criteria criteria = session.createCriteria(clazz);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
如果您使用的是JPA,请尝试以下操作:
CriteriaQuery<Group> query = cb.createQuery(Group.class);
query.distinct(true);