1 対多の関係エンティティがあります シナリオはこのようなものです EmployeeGroupActivity には多くの EmployeeActivity があります Hibernate マッピングは次のように行われます
@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オブジェクトを持つイベントに対して1つのEmployeeGroupActivityが期待されます。
しかし、同じ groupActivityId を持つ多くの EmployeeGroupActivity オブジェクトとして結果を取得していますが、各オブジェクトには EmployeeActivity のセットに 1 つの EmployeeActivity オブジェクトがあります。
これは、休止状態の基準でプロジェクションを使用する場合にのみ発生します。プロジェクションを使用しない場合、多くの EmployeeActivity オブジェクトを持つ 1 つの EmployeeGroupActivity オブジェクトを取得します。
基準にsetResultTransformerを使用してhttp://stackoverflow.com/questions/20331852/java-hibernate-transformer-aliastobeannestedresulttransformer
おり、SOの一部によって投稿されたライブラリを使用しています
予測を使用して従業員活動のセットを取得するには? 私はそのような多くの要件を持っており、結果を反復し、1 つのルート オブジェクトにすべてのセット アイテムを追加し、多くの反復を必要とする応答を返さなければならないすべての場所があります。
更新: DISTINCT_ROOT_ENTITY が機能しなかったことに注意してください