使用JPA避免结果列表中的重复项

时间:2014-07-21 12:37:59

标签: java hibernate jpa

我的Group s包含GroupElement的问题。

例如,使用此数据:

  • A组包含元素1,2,3
  • B组包含元素4,5,6

我尝试列出Group,并期望每个Group获得2 GroupElementGroup

相反,每个Group都是重复的。我实际上获得了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

我的猜测是,每个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来修复它,但我问这个问题是为了找到更好的解决方案。

1 个答案:

答案 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);