我使用fetch = join编写了HQL查询。它在set中配置。如果我尝试使用父hibernate检索数据,则不会生成join语句。它使用N + 1获取数据。为什么hibernate无法为父记录和子记录生成单个join语句。
映射文件:
<hibernate-mapping>
<class name="com.joins.test.Vendor" table="vendor">
<id name="vendorid" column="vid">
<generator class="native" />
</id>
<property name="vendorname" type="string">
<column name="vname" length="10" not-null="true" />
</property>
<set name="children" inverse="false" cascade="all" lazy="false" fetch="join">
<key column="vendid" not-null="true" />
<one-to-many class="com.joins.test.Customer" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.joins.test.Customer" table="customer">
<id name="customerid" column="cid">
<generator class="native" />
</id>
<property name="customername" type="string">
<column name="cname" length="10" not-null="true" />
</property>
</class>
</hibernate-mapping>
这是我获取数据的代码:
Query q=sn.createQuery("from Vendor");
List<Vendor> l=q.list();
for(Vendor v:l)
{
System.out.print(" vendorname "+v.getVendorname());
Set<Customer> s=v.getChildren();
Iterator<Customer> it=s.iterator();
while(it.hasNext()){
Customer cs=it.next();
System.out.println(" customername "+cs.getCustomername());
}
}
答案 0 :(得分:0)
HQL的工作方式与sql相同,不同之处在于HQL支持hibernate实体,而我们解雇任何查询。
如果你想要&#34;加入&#34;查询你将不得不使用&#34;加入&#34;明确是因为HQL避免fetch="join"
或fetch="select"
。