※この記事は丸太式 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で整形すれば、適度にインデントが設定されて見やすい
「俺ならこういう理由でこうしたい!」という話があれば、是非お聞かせください。