我使用的是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名员工?
答案 0 :(得分:0)
明智地使用distinct
通常可以处理由笛卡尔效应引起的重复,例如:
select distinct Employee...
但更一般地说,您可以通过选择Set而不是List来确定这一点,并确保在Employee
类上有一个好的equals()和hashCode()实现 - Set将确保您只为每个员工获得一个实例...