我正在使用Hibernate(3.3.x),我有两个实体:

public class FtChargeAcctPkgDtl {
    private FtChargeAcctPkgDtlId id;
    private Set<FtChargeAcctPkgRate> ftChargeAcctPkgRates;
}




public class FtChargeAcctPkgRate {
    private FtChargeAcctPkgRateId id;
}


(为简单起见,省略了其他属性和设置器)。

我有一个本地查询:

<sql-query name="readSymbolsFtPackages">
    <return alias="pkgDtl" class="somepackage.FtChargeAcctPkgDtl"/>

    <return-join alias="pkgRate" property="pkgDtl.ftChargeAcctPkgRates"/>
    <![CDATA[
    SELECT {pkgDtl.*}, {pkgRate.*}

    FROM ft_charge_acct_pkg_dtl pkgDtl

    JOIN ft_charge_acct_pkg_rate pkgRate
      ON pkgRate.master_seq_no = pkgDtl.master_seq_no -- just primary key
        AND pkgRate.pkg_id = pkgDtl.pkg_id
]]>
</sql-query>


该查询应该(我希望)为pkgDtl中的每个项目返回一行,并填充FtChargeAcctPkgDtl#ftChargeAcctPkgRates。但是实际上,它为ft_charge_acct_pkg_rate中的每个项目返回一行。

假设在主(pkgDtl)表中有5行,在连接的表中有50行(单个pkgDtl的平均行数为10 pkgRates)。当我使用

Query query = session.getNamedQuery("readSymbolsFtPackages");
query.list();


我得到50行。其中有45个重复。我想得到这5个pkgDtls,每个都填充pkdRates。有没有办法在冬眠中做到这一点?

最佳答案

用:

Query query = session.getNamedQuery("readSymbolsFtPackages");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
query.list();


问候

08-27 23:50