ConditionBeanのスコープ

概要

DBFluteは、DBアクセスの大きな2つのやり方を提供しています。それはConditionBeanと外だしSQL(OutsideSql)です。これら2つの存在意義に関してはここでは割愛させて頂き、いざ実装するときにこの2つのどちらを利用すれば良いのかに焦点を当てます。

当然、「ConditionBeanでできないことは外だしSQLで」という正論に間違いはありませんが、 プログラマがConditionBeanの全ての機能を頭の中で抑えていることはなかなかないかと思われます。 そこで、素早く判断するための「判断の流れ」を紹介したいと思います。

A. 明らかな外だしSQLか否かを判断

ConditionBeanのスコープを確認する前に、まずは「明らかに外だしSQLでやるべき」と言えるものを確認していきます。 こうすることで、ConditionBeanを意識する前の早い段階で判断が可能です。

以下はConditionBeanでは実現できないことが確定しているものです。

目的(やりたいこと)が明確であることが前提です。そのDBアクセス要件がどういう結果を欲しているのかをSQL(という手段)にとらわれず考えることが大事です。 もし、やりたいことが「テーブル検索の結果セットに子テーブル導出カラムを追加したい」であれば、 Group By句を使っても実現はできますが(インラインビュー内でGroup Byを利用)、実はSelect句での相関サブクエリでも実現でき、 しかも、(状況次第ではありますが)後者の方がパフォーマンスに相性も良く、ConditionBeanの「(Specify)DerivedReferrer」機能で実装することができます。 「Group Byという手段」が頭の中で先行しているとこれを見落としてしまう可能性があります。これはDBFluteでなくても(普通にSQLを書く上で)不利益なことです。 まず目的(やりたいこと)を明確にしてから、それを実現する(最適な)手段が上記のものかどうかを判断して下さい。

B. ConditionBeanのスコープを判断

そして、ConditionBeanのスコープからConditionBeanで実装できるか確認していきます。

「明らかな外だしSQL」を通り過ぎたこの時点ではConditionBeanで実装可能である可能性が高いです。 実際にConditionBeanを実装しながらの確認でも構いません。後に「やはり外だしSQLで実装」となっても、 そのConditionBeanの実装は無駄にはなりません。それは「C」において後述しますが、 近いところまで実装したConditionBeanから外だしSQLの土台となるSQLが生成できるからです。

以下がConditionBeanのスコープです。

Select句

From句

Where句

OrderBy句

Union句

その他

C. やはり外だしSQLであると判断

ここまで来たら、やはり「外だしSQLで」ということになります。

ここで、ちょっとした「外だしSQL」の実装支援を紹介します。 もし、この時点でConditionBeanで近いところまで実装済みであれば、それは消してはいけません。 以下の手順が可能だからです。

  1. ConditionBeanでできるところまでテスト実装
  2. ConditionBeanのtoDisplaySql()の戻り値をログに出力
  3. ログ出力されたSQL文を外だしSQLの土台として活用

このようにすることで、外だしSQLの実装にてSQLの構文やテーブル名、カラム名を一から書く必要はなくなり、 スペルミスなどのケアレスミスもなくなります。また、判断の流れの中で実装したConditionBeanは全く無駄になりません。

Document

Topics