使用JPA避免结果列表中的重复项 [英] Avoiding duplicates in result list with JPA

查看:229
本文介绍了使用JPA避免结果列表中的重复项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对包含GroupElementGroup有问题.

例如,使用此数据:

  • 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆