相変わらず受身なフレームワークに踊らされてます
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はこっちからいちいち命令してやらないと何もしてくれない。
その点RailsのActiveRecordは優秀だなと思います。