【问题标题】:Hibernate one to many returning multipe duplicate objects休眠一对多返回的多个重复对象
【发布时间】: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


    【解决方案1】:

    这是 Hibernate 标准的一个已知问题。 消除重复的解决方法是 通过

    获得与您的约束匹配的不同ID
    criteria.setProjection(Projections.distinct(Projections.id()));
    idList = criteria.list();
    

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

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

    希望这行得通。

    【讨论】:

    • 我忘了在帖子中提到:使用投影时 DISTINCT_ROOT_ENTITY 不起作用。也会有同样的问题。
    • @Sadanand 你试过我的代码了吗?实际上DISTINCT_ROOT_ENTITY 不是必需的。
    • 是的,我已经尝试过了。但是如果是一对多就不行了
    猜你喜欢
    • 2012-01-11
    • 2018-01-11
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多