※この記事は丸太式 Advent Calendarの15日目です
業務でHibernateを使っていますが、これまでは弊社内の大半の実装に合わせてこんな感じでCriteriaを書いていました。
Criteria criteria = session.createCriteria(Hogehoge.class); criteria.add(Restrictions.eq("userCode", userCode)); criteria.add(Restrictions.in("fugaCode", fugaCodes); criteria.add(Restrictions.ge("targetYearMonth", targetDate); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.sum("days").as("days")); projectionList.add(Projections.sum("hours").as("hours")); criteria.setProjection(projectionList); criteria.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
今日は実装中に仕様追加が発生したので、ストレス解消を兼ねてスピード重視で実装したら、いつの間にかメソッドチェーンで書いていました。
Criteria criteria = session.createCriteria(Fugafuga.class) .add(Restrictions.eq("userCode", userCode)) .add(Restrictions.in("fugaCode", fugaCodes)) .add(Restrictions.ge("targetYearMonth", targetDate)) .setProjections(Projections.projectionList() .add(Projections.sum("days").as("days")) .add(Projections.sum("hours").as("hours"))) .setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
流れるように実装できたので、自分にはメソッドチェーンの方が向いているようです。
弊社のコーディング規約に特に記載が無ければ、今後ともメソッドチェーンで書きたいですね。
Criteriaをメソッドチェーンで書くと、次のような利点があるように思います。
* (作るべきSQLが見えているなら)流れるように書き表すことが出来る
* わざわざcriteria(変数名)や;(セミコロン)を書かなくて良い
* ProjectionListを変数に格納しなくても良い
* Eclipse等のIDEで整形すれば、適度にインデントが設定されて見やすい
「俺ならこういう理由でこうしたい!」という話があれば、是非お聞かせください。