我有一个名为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对象正在重复。我应该如何避免它?
答案 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);