Hibernate要求使用多个选择而不是一个集合,如何更改它?

时间:2013-05-19 11:05:10

标签: java oracle hibernate

我使用的是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名员工?

1 个答案:

答案 0 :(得分:0)

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

select distinct Employee...

但更一般地说,您可以通过选择Set而不是List来确定这一点,并确保在Employee类上有一个好的equals()和hashCode()实现 - Set将确保您只为每个员工获得一个实例...