【发布时间】:2015-10-11 17:34:36
【问题描述】:
我有一个一对多的关系实体 场景是这样的 EmployeeGroupActivity 有很多 EmployeeActivity Hibernate Mapping如下完成
@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 时,我期望一个 EmployeeGroupActivity 用于具有许多 EmployeeActivity 对象的事件。
但我得到的结果是 许多 EmployeeGroupActivity 对象都具有相同的 groupActivityId,但每个对象在一组 EmployeeActivity 中都有一个 EmployeeActivity 对象。
只有当我使用带有休眠条件的投影时才会发生这种情况,如果我不使用投影,我将得到一个 EmployeeGroupActivity 对象,它有许多 EmployeeActivity 对象。
我正在使用 setResultTransformer 作为标准和一个库 http://stackoverflow.com/questions/20331852/java-hibernate-transformer-aliastobeannestedresulttransformer 在 SO 中发布的一些人
如何获得带有预测的员工活动集?我有很多这样的要求,我必须在每个地方迭代结果并让一个根对象添加所有设置项,然后作为响应返回,这需要大量迭代。
更新:请注意 DISTINCT_ROOT_ENTITY 不起作用
【问题讨论】:
标签: java hibernate nhibernate-projections