我正在使用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。有没有办法在休眠中执行此操作?
答案 0 :(得分:3)
使用:
Query query = session.getNamedQuery("readSymbolsFtPackages");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
query.list();
此致
答案 1 :(得分:2)
受到@ manu-navarro的启发,我带着这个变压器来了:
/**
* Transformer, that returns only distinct rows from the set.
*
* Distinction is based on all <return alias/> items.
*/
public class DistinctResultTransformer extends BasicTransformerAdapter {
@Override
public List transformList(List collection) {
// set of objects already in the result
Set<List<Object>> existingRows = new HashSet<List<Object>>();
List result = new ArrayList();
for (Object row : collection) {
// array must be converted to list as array has equals() implemented using ==
List<Object> rowAsList = Arrays.asList((Object[]) row);
if (!existingRows.contains(rowAsList)) {
existingRows.add(rowAsList);
result.add(row);
}
}
return result;
}
}
然后使用
注册Query query = session.getNamedQuery("readSymbolsFtPackages");
query.setResultTransformer(new DistinctResultTransformer());
query.list();
这很有效。