hibernate 复合主键 关联查询

keruis 2014-05-23

<hibernate-mapping>
    <class name="com.wht.tables.MerchantFeeRate" table="MERCHANT_FEE_RATE" dynamic-update="true">
        <composite-id name="id" class="com.wht.tables.MerchantFeeRateId">
            <key-many-to-one name="merchant" class="com.wht.tables.Merchant">
                <column name="MERCHANT_NO" length="20" />
            </key-many-to-one>
            <key-many-to-one name="tradeType" class="com.wht.tables.TradeType">
                <column name="TRADE_TYPE" length="4" />
            </key-many-to-one>
        </composite-id>
        <property name="rate" type="java.math.BigDecimal">
            <column name="RATE" precision="6" scale="4" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

通常在使用联合主键,也意味着这些列也是别的表的主键,既是主键,又是外键,这是hibernate映射中比较复杂的情况。对于双主键,双外键这种常见的情况将会带来如下问题:

1.排序字段怎么写?

只能写id;hibernate相当于会按照该表的主键排序。

如果我们想按照关联表的某个其它字段来排序呢?因为主键通常是编号,通常我们希望排序的是名称字段什么的。

qb.getDetachedCriteria().setFetchMode("id.merchant",FetchMode.JOIN);

qb.getDetachedCriteria().createAlias("id.merchant","c");

qb.addOrderBy(Order.asc("c.merchantName"));

结论是:通过id类无法关联到关联表,innerjoin不上关联表,不知道为什么。是不支持这么操作还是什么原因?

2.查询条件有可能是关联表的某列,如何进行关联?

当前没有解决1,2问题,所以没有单独映射主键类,从而此处变通,使用了hql查询,返回数据中由于包含了关联表的字段。所以返回结果成了数组。不能按照对象去取。

3.如何唯一确定一条记录?

这个比较好办,构造id对象,然后使用条件查询:

CardSubTypeIdcardSubTypeId=newCardSubTypeId(selectedMainType,cardParaInfo.getCardSubTypeId().getCardSubType());

Criterion[]criterion=newCriterion[]{Restrictions.eq("cardSubTypeId",cardSubTypeId)};

CardParacp=(CardPara)cardParaDao.getFirst(CardPara.class,criterion);

相关推荐

LetonLIU / 0评论 2020-05-29
东方咖啡屋 / 0评论 2020-01-06