HibernateのCriteiraをメソッドチェーンで書いたらなぜかテンションが上がった件

※この記事は丸太式 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で整形すれば、適度にインデントが設定されて見やすい

「俺ならこういう理由でこうしたい!」という話があれば、是非お聞かせください。

コメントを残す