A Day In The Life

とあるプログラマの備忘録

相変わらず受身なフレームワークに踊らされてます

Hibernateでイーガフェッチを使うと重複行までとってきてしまいます。

普通、重複行は持ってこないだろと思うのですがそんなに親切ではありませんでした。

通常eagerなコレクションフェッチをすると重複が出てしまうため、あなたが期待するような行数にはならないのです。
ということらしいです。

Hibernateインアクションを調べるとCriteria#returnMapsってメソッドを使えばいいよと書いてありましたが、returnMapsメソッドはHibernate3には存在しない...。



変わりにsetResultTransformerメソッドを使うとできました。

public List findBySearchConditions() {
    return session.createCriteria(Hoge.class)
            .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
            .list();
}

Springと連携してるときは

public List findBySearchConditions() {
    DetachedCriteria criteria = DetachedCriteria.forClass(Hoge.class);
    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    return getHibernateTemplate().findByCriteria(criteria);
}

こんな感じでOKです。



それにしてもHibernateはこっちからいちいち命令してやらないと何もしてくれない。

その点RailsActiveRecordは優秀だなと思います。

参考