gpt4 book ai didi

java - Hibernate 一对多返回多个重复对象

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:36 24 4
gpt4 key购买 nike

我有一对多关系实体场景是这样的EmployeeGroupActivity 有很多 EmployeeActivityHibernate映射完成如下

@Entity
@Table(name = “employeegroupactivity”)
@DynamicUpdate
public class EmployeeGroupActivity{

/**
*
*/
private static final long serialVersionUID = -9114620718714111316L;
private Integer groupActivityId;

private Set<EmployeeActivity> employeeActivities;

public EmployeeGroupActivity(){

}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "groupActivityId")
public Integer getGroupActivityId() {
return groupActivityId;
}
public void setGroupActivityId(Integer groupActivityId) {
this.groupActivityId = groupActivityId;
}

@OneToMany(targetEntity = EmployeeActivity.class,mappedBy = "groupEmployeeActivity",fetch = FetchType.LAZY)
public Set<EmployeeActivity> getEmployeeActivities() {
return employeeActivities;
}

public void setEmployeeActivities(Set<EmployeeActivity> employeeActivities) {
this.employeeActivities = employeeActivities;
}
}

// EmployeeActivity
@Entity
@Table(name = "employeeactivity")
@DynamicUpdate
public class EmployeeActivity{
private Integer empActivityId;
String activityDescription;
Date activityDate;
private Integer eventId;
private EmployeeGroupActivity groupEmployeeActivity; //This is mapped as ManyToOne
}

// Query Part
Criterion eventIdCriterion = Restrictions.eq(“EG.eventId", eventId);
Projection projection = Projections.projectionList()
.add(Projections.property(“EG.groupActivityId"),"groupActivityId")
.add(Projections.property("EMPACT.empActivityId”), "employeeActivities.empActivityId")
.add(Projections.property("EMPACT.activityDescription”), "employeeActivities.activityDescription")
.add(Projections.property("EMPACT.activityDate"), "employeeActivities.activityDate");


Criteria criteria = sessionObject.createCriteria(EmployeeGroupActivity.class,”EG")
.createAlias(“EG.employeeActivities", “EMPACT”)
.setProjection(projection)
.add(eventIdCriterion);

criteria
.setResultTransformer(new AliasToBeanNestedResultTransformer(
GroupActivityResponse.class));

当我使用 where 子句获取 EmployeeGroupActivity 时,我希望为具有许多 EmployeeActivity 对象的事件获取一个 EmployeeGroupActivity。

但是我得到的结果是许多 EmployeeGroupActivity 对象都具有相同的 groupActivityId,但每个对象在一组 EmployeeActivity 中都有一个 EmployeeActivity 对象。

只有当我使用具有 hibernate 条件的投影时才会发生这种情况,如果我不使用投影,我将得到一个具有许多 EmployeeActivity 对象的 EmployeeGroupActivity 对象。

我正在使用setResultTransformer作为标准和一个库http://stackoverflow.com/questions/20331852/java-hibernate-transformer-aliastobeannestedresulttransformer由一些人在SO中发布

如何获取带有预测的员工 Activity 集?我有很多这样的要求,每一个地方我都必须迭代结果并使一个根对象添加所有设置项然后返回响应,这需要大量迭代。

更新:请注意,DISTINCT_ROOT_ENTITY 不起作用

最佳答案

这是 Hibernate 标准的一个已知问题。消除重复的解决方法是获取与您的约束相匹配的不同 id

criteria.setProjection(Projections.distinct(Projections.id()));
idList = criteria.list();

然后您可以创建另一个条件来获取返回的 ID 的详细信息

criteria2.add(Restrictions.in("id", idList));
requiredList = cr.list();

希望这能起作用。

关于java - Hibernate 一对多返回多个重复对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553033/

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