Hibernate fetch = join / select不适用于HQL?

时间:2016-07-26 02:35:39

标签: hibernate caching hibernate-mapping hibernate-criteria

我使用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());
            }
        }

1 个答案:

答案 0 :(得分:0)

HQL的工作方式与sql相同,不同之处在于HQL支持hibernate实体,而我们解雇任何查询。

如果你想要&#34;加入&#34;查询你将不得不使用&#34;加入&#34;明确是因为HQL避免fetch="join"fetch="select"