Hibernate查询问题

时间:2010-12-16 20:20:36

标签: java sql hibernate join hql

我正在使用Hibernate。我的数据库如下

类别有很多属性

班级类别 包含

private Set <Attribute> AllAttributes= new HashSet  <Attribute>();

类属性

如何检索所有类别及其属性,因为我正在尝试'从类别'但它无法正常工作

类别映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 8:37:02 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY">
        <id name="CategoryId" type="long">
            <column name="CATEGORYID" />
            <generator class="native" />
        </id>
        <property name="CategoryName" type="java.lang.String">
            <column name="CATEGORYNAME" />
        </property>

        <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category">
            <column name="PARENT_CATEGORY_ID" />
        </many-to-one>

        <set name="SubCategory" lazy="false" cascade="all-delete-orphan" inverse="true">
            <key>
                <column name="PARENT_CATEGORY_ID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Category" />
        </set>

        <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true"  cascade="all">
            <key>
                <column name="CATEGORYID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Attribute" />
        </set>

    </class>
</hibernate-mapping>

属性映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Attribute" table="ATTRIBUTE">
        <id name="AttributeId" type="long">
            <column name="ATTRIBUTEID" />
            <generator class="native" />
        </id>
        <property name="AttributeName" type="java.lang.String">
            <column name="ATTRIBUTENAME" />
        </property>
        <set name="Options" table="ATTRIBUTEOPTION" inverse="false"  cascade="all">
            <key>
                <column name="ATTRIBUTEID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.AttributeOption" />
        </set>
    </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:2)

您已将关联映射到lazy="true"。这告诉hibernate默认情况下,类别的属性只应在实际访问时从数据库加载,而lazy="false"则指示hibernate在加载类别时加载属性。但是,映射文件中的指令会影响所有查询。

如果您只想要特定查询,请查看 http://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-joins

  

“获取”连接允许关联或   价值集合   与父母一起初始化   使用单个选择的对象。这是   在a的情况下特别有用   采集。它有效地覆盖了   外连接和延迟声明   关联的映射文件   和收藏品。见第20.1节,   “获取策略”了解更多   信息。

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens
     

通常不需要获取提取连接   分配一个别名,因为   不应使用关联对象   在where子句(或任何其他   条款)。相关的对象是   也没有直接退回   查询结果。相反,他们可能是   通过父对象访问。该   只有你可能需要别名的原因是   如果你以递归方式连接取一个   进一步收集:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens
     

不能使用fetch构造   使用iterate()调用的查询(但是   可以使用scroll())。抓取应该是   与setMaxResults()或。一起使用   setFirstResult(),作为这些操作   基于结果行   通常包含重复的渴望   集合提取,因此,数量   行不是你所期望的。   Fetch也不应该一起使用   有条件的即兴。它是   可以创建一个笛卡尔积   通过join获取多个   在查询中收集,所以要小心   这个案例。加入获取多个   集合角色可以产生   袋映射的意外结果,   因此,建议用户自行决定   在这种情况下制定查询。   最后,请注意完全加入fetch和   右连接获取没有意义。