Как получить сущность без дублирования, даже если ее дочерний элемент выбран? - PullRequest
2 голосов
/ 06 июля 2010

У меня есть объект с именем 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 Ответ

3 голосов
/ 07 июля 2010

Заменить setResultTransformer(CriteriaSpecification.ROOT_ENTITY) на setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

Это будет сделано!

РЕДАКТИРОВАТЬ: после прочтения комментария ОП

В этомкак мне вывести propertyConcern == нулевое свойство сверху в порядке?

На самом деле, Oracle имеет концепцию NULLS FIRST / LAST (Название темы: сортировка)

Но я GUESS Criteria API не поддерживает эту возможность (причина может быть в том, что только Oracle (или несколько RDBMS) поддерживают эту возможность, хотя и не уверен).

Хорошо, независимо от причины, по которой Criterai API не поддерживает это, вы можете выполнить следующий трюк, чтобы заставить его работать .... (при условии, что ваша БД поддерживает Null 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...