即使获取子项,如何检索实体而不重复?

时间:2010-07-06 15:23:14

标签: hibernate

我有一个名为Property的对象。在这个多重关注的问题。

<class name="Property"
        table="T_PROPERTY">
        <id name="propertyId" type="integer" column="PRTY_ID">
            <generator class="native" />
        </id>

        <property name="propertyName" column="PRTY_NAME" type="string"/>
        <many-to-one name="propertyType" class="com.mmm.ehspreg2.entity.property.PropertyType" column="PRTY_TYP_ID" />
        <property name="active" column="ACTV" type="boolean"/>

                <set name="propertyConcern">
                 <key column="PRTY_ID"/> 
                 <one-to-many class="PropertyConcern"/>
        </set>
    </class>

<class name="PropertyConcern"
        table="T_CONCERN">
        <id name="prtyCrnId" type="integer" column="PRTY_CRN_ID">
            <generator class="native" />
        </id>

        <many-to-one name="concern"
            class="com.mmm.ehspreg2.entity.property.Concern" column="CRN_ID" />
        <many-to-one name="property"
            class="com.mmm.ehspreg2.entity.property.Property" column="PRTY_ID" />

    </class>

所以我需要唯一属性对象列表。以下是我的代码:

Criteria criteria = getPersManager().getCurrentSession()
                .createCriteria(Property.class).createAlias("propertyType",
                        "type").createCriteria("propertyConcern",
                        "propertyConcern", CriteriaSpecification.LEFT_JOIN)
                .createCriteria("propertyConcern.concern",
                        CriteriaSpecification.LEFT_JOIN).setFetchMode("type",
                        FetchMode.JOIN).setFetchMode("propertyConcern",
                        FetchMode.JOIN).setFetchMode("propertyConcern.concern",
                        FetchMode.JOIN).setResultTransformer(
                        CriteriaSpecification.ROOT_ENTITY);

属性列表,如果我遍历属性,我应该得到其他对象。我能够获取其他对象,但Property对象正在重复。我应该如何避免它?

1 个答案:

答案 0 :(得分:3)

替换  setResultTransformer(CriteriaSpecification.ROOT_ENTITY)setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

那会的!

阅读OP的评论后

编辑

  

在这个如何将orderConcern == null属性置于订单的顶部?

实际上,Oracle确实有NULLS FIRST/LAST(主题名称:排序)

的概念

但是,我 GUESS Criteria API不支持此工具(原因可能是只有Oracle(或少数RDBMS)支持此工具,但不确定)。

好的,不管Criterai API不支持这个的原因,您可以执行以下技巧使其工作....(假设您的数据库支持Nulls First / Last)

Order o = new Order(${propertyName}, true) {
        @Override
        public String toSqlString(Criteria criteria, org.hibernate.criterion.CriteriaQuery criteriaQuery)
                throws HibernateException {
            return super.toSqlString(criteria, criteriaQuery) + " NULLS FIRST"; /* or LAST*/
        }

    };

其中$ {propertyName}表示您要排序的属性名称

然后

criteria.addOrder(o);