gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:57 24 4
gpt4 key购买 nike

我对包含 GroupElementGroup 有问题。

例如,使用此数据:

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

我尝试列出 Group 并期望在每个 Group 中获得 2 个 Group 和 3 个 GroupElement

相反,每个 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

我的猜测是为每个 GroupElement 重建一个 Group

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

最佳答案

将 ResultTransformer 设置为您 (Hibernate)Criteria,您将获得没有重复的结果:

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

关于java - 使用 JPA 避免结果列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com