我有一个关于hibernate的渴望和延迟加载的问题。 我有以下设置:
public Person {
int prsnId;
Set<Preferences> preferences;
Set<ContactDetails> contactDetails;
//constructor
//getters & setters
}
冬眠映射:
<hibernate-mapping>
<class name="be.bene.cris2.protocol.Person" table="BENE_CUST_PERSON" dynamic-update="true" dynamic-insert="true">
<id name="prsnId" type="int">
<column name="PRSN_ID" precision="10" scale="0" />
<generator class="sequence">
<param name="sequence">CUST_PROR_SEQ</param>
</generator>
</id>
<set access="field" name="preferences" table="PRSN_PREF" inverse="true">
<key column="PRSN_ID" not-null="true"/>
<one-to-many class="Preferences" not-found="ignore"/>
</set>
<set access="field" name="contactDetails" table="CNTCT_DETAILS" inverse="true">
<key column="PRSN_ID" not-null="true"/>
<one-to-many class="ContactDetails" not-found="ignore"/>
</set>
</class>
</hibernate-mapping>
现在,当我执行以下查询时,我想知道是否可以在运行时决定例如首选项应该是急切加载但是contactDetails应该是延迟获取的,或者有时根本不会被提取。
Criteria criteria = session.createCriteria(Person.class);
criteria.setFirstResult(startRow)
.setMaxResults(pageSize)
.add(Restrictions.eq("prsnId", id))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
;
List<Person> personList = criteria.list();
提前致谢。
答案 0 :(得分:1)
您可以使用
获取关联criteria.setFetchMode("preferences", FetchMode.JOIN);
在这种情况下,将在同一查询中与人员一起提取首选项,并且将懒惰地获取联系人详细信息(这意味着只有在您在联系人详细信息集上调用方法时才会获取它们)
但问题是,连接提取不能与setFirstResult()
和setMaxResults()
一起使用,因为它们直接应用于SQL语句,因此用于设置第一个和最大值SQL查询返回的行数。如果首选项是连接获取的,则单个人对应多行(每个首选项一行)。