使用JPA避免结果列表中的重复项 [英] Avoiding duplicates in result list with JPA
问题描述
我对包含GroupElement
的Group
有问题.
例如,使用此数据:
- A组包含元素1,2,3
- B组包含元素4,5,6
我尝试列出Group
,并希望得到2个Group
,每个Group
中有3个GroupElement
.
I try to list the Group
and expect to get 2 Group
with 3 GroupElement
in each Group
.
相反,每个Group
都是重复的.我实际上得到了6个Group
:
Instead, each Group
is duplicated. I actually obtain 6 Group
:
- A组包含元素1,2,3
- A组包含元素1,2,3
- A组包含元素1,2,3
- B组包含元素4,5,6
- B组包含元素4,5,6
- B组包含元素4,5,6
我的猜测是,每个GroupElement
都会重新构建一个Group
.
My guess is that a Group
is rebuilt for each GroupElement
.
我在SO上进行搜索,发现问题可能出在equals()/hashCode()
定义或请求编写的方式上,所以我给你们两个.
I searched on SO and found that the problem could come from the equals()/hashCode()
definition or from the way the request is written so I give you both.
我有这个映射:
@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修复它,但是我问这个问题是为了找到更好的解决方案.
I can fix it with an intermediate Set but I ask this question in order to find a better solution.
推荐答案
将ResultTransformer设置为您(休眠)标准,您将获得没有重复项的结果:
Set ResultTransformer to you (Hibernate)Criteria and you will get result without duplicates:
Session session = getSession();
Criteria criteria = session.createCriteria(clazz);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
如果您使用的是JPA,请尝试以下操作:
If you are using JPA, try this:
CriteriaQuery<Group> query = cb.createQuery(Group.class);
query.distinct(true);
这篇关于使用JPA避免结果列表中的重复项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!