0

我正在使用 HIbernate 3、Oracle 和 Java。我有一个 Employee 类和这个映射:

<set name="meetings" table="EMPLOYEE_MEETING" inverse="false" lazy="false" fetch="select" cascade="all" >
    <key column="EMPLOYEE_ID" />
    <composite-element class="EmployeeMeeting">
        <parent name="employee" />
        <many-to-one name="meeting" column="MEETING_ID" not-null="true" cascade="all"
            class="Meeting" />
        <property name="opinion" column="OPINION" />
    </composite-element>
</set> 

有超过 100 次会议,Hibernate 使用以下选择超过 100 次: Hibernate: select this_.EMPLOYEE_ID as EMPLOYEE1_0_0_, this_.firstname as firstname0_0_, this_.lastname as lastname0_0_ from EMPLOYEE this_ where this_.EMPLOYEE_ID=? Hibernate: select meetings0_.EMPLOYEE_ID as EMPLOYEE1_0_, meetings0_.MEETING_ID as MEETING2_0_, meetings0_.OPINION as OPINION0_ from EMPLOYEE_MEETING meetings0_ where meetings0_.EMPLOYEE_ID=?

现在有一个查询

    List emps = session.createCriteria(Employee.class)
    .add( Restrictions.eq("age", new Long(25)) ).list();

该查询返回 10 名年龄为 25 岁的员工,并执行超过 100 次在日志中可见的选择。

我尝试将 fetch="select" 更改为 fetch="join" 但存在笛卡尔效应,该查询将返回大量相同的员工。尽管在日志文件中可以看到对数据库的一个查询,但这也是错误的解决方案..

如何更改它以便 Hibernate 可以使用尽可能少的数据库选择检索会议集合,但仍返回 10 名员工?

4

1 回答 1

0

明智地使用distinctcan 通常处理由笛卡尔效应引起的重复,例如:

select distinct Employee...

但更一般地说,您可以通过选择 Set 而不是 List 来处理此问题,并确保您的Employee类上有良好的 equals() 和 hashCode() 实现 - Set 将确保您只为每个 Employee 获得一个实例...

于 2013-05-19T11:17:11.517 回答