WHERE句の動的生成の枠組み考え中
一般的なアプリで必ず必要となるデータベースへの検索機能。特にユーザが自由に検索条件を変えることができるような場合,検索条件を動的に組み立てる必要が出てくる。つまり,SQL文のWHERE句の条件式をプログラムで組み立てなければならないのだ。
条件式はよほど特殊なアプリでない限り,決まりきったものだ。等号,否定,論理積,論理和,くらいだろうか。文字列的には大したことないものなのに,プログラムで作るとなると,なぜかうまくいかない。しかも,オブジェクト的に条件文を表すことを,アプリを作るたびに毎度毎度書いている気がする。
いま作っているアプリは,Hibernateを使っている。HibernateではCriteria APIを使うと,条件式をオブジェクト的に構築することができる。これを使えば話は終わるのだが,Struts+SpringFramework+Hibernateの組み合わせでは,CriteriaはあくまでDAO層での使用に止めるべきであり,Web層ではもちろん使うべきではない。独自に条件式をオブジェクトで組み立てるためにクラス群を考えなければならないのだ。
僕はWeb層からビジネスロジック層へ情報を渡す場合,インタフェースを使ったアプローチをよく使う。ビジネスロジック層で欲しい情報を取得するためのインタフェースを定義し,Web層ではそのインタフェースを実装したクラス(たとえばActionForm)を作って,Web層からビジネスロジック層へ直接オブジェクトを渡せるようにするのだ。オブジェクトからオブジェクトへの情報の引越しほど,無駄な処理はないと思っていることが,インタフェースのアプローチを使う動機になっている。
しかし,こと条件式に関しては,そんなにうまくいかなそうだ。指定された条件式を画面に表示するためのオブジェクト構造と,条件式そのものの論理的なオブジェクト構造が,どうしても一致しない。
何か共通的に使いまわせるインタフェースなり抽象クラスなりが導き出せそうなんだけど。一晩寝れば閃くかな。。。