1

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 が機能しなかったことに注意してください

4

1 に答える 1

1

これは、Hibernate 基準の既知の問題です。重複を排除するための回避策は、制約に一致する個別の ID を取得することです。

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

次に、別の条件を作成して、返された ID の詳細を取得できます

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

これがうまくいくことを願っています。

于 2015-07-22T03:35:36.533 に答える