[Seasar-user:3558] S2DaoのSQLコメントについて

Momotaro Nishiumi [E-MAIL ADDRESS DELETED]
2006年 4月 26日 (水) 15:36:02 JST


ももたろです。

S2Dao1.0.32を使用しています。

検索条件DTO(HogeConditionDto)に値が格納されている場合のみ、
検索条件として指定したいと思い、以下のようなDAOインターフェースを
書いたのですが、field1がnullの場合に、SQLExceptionが発生してしまいます。

public interface HogeDao {
  public static final Class BEAN = Hoge.class;

  public List find(HogeConditionDto dto);
  public static final String find_ARGS = "dto";
  public static final String find_QUERY 
    = "/*IF dto.field1 != null */ field1 = /*dto.field1*/'001' /*END*/"
    + "/*IF dto.field2 != null */ AND field2 = /*dto.field2*/'001' /*END*/";
}

デバッグログに出力されているSQLを見ると、

   SELECT 〜〜 FROM hoge WHERE AND field2 = '001'

となってしまっているので、SQLExceptionが発生してしまっている原因は
わかっているのですが、この問題のスマートな解決方法が思いつきません。

二つほど代替案を考えたのですが、どちらもしっくり来ないです。

案1)ダミーの検索条件をつけちゃう。

  public static final String find_QUERY 
    = "1 = 1 "
    + "/*IF dto.field1 != null */ AND field1 = /*dto.field1*/'001' /*END*/"
    + "/*IF dto.field2 != null */ AND field2 = /*dto.field2*/'001' /*END*/";

とすることで、常にひとつはWHERE句の条件がつきますので、
一応意図する動作はしますが、余計な条件があるのが気持ち悪いです。

案2)SQLアノテーションにする。

  public static final String find_SQL
    = "SELECT * FROM hoge "
    + "/*BEGIN*/WHERE "
    + "/*IF dto.field1 != null */ AND field1 = /*dto.field1*/'001' /*END*/"
    + "/*IF dto.field2 != null */ AND field2 = /*dto.field2*/'001' /*END*/"
    + "/*END*/";

SQLアノテーションでSQLコメントのBEGIN〜ENDを使うと、
WHERE句の直後にあるANDが取り除かれるようで、
これも意図する動作をしてくれます。
けれど、SELECT句、FROM句を書かなきゃいけないのが面倒です。


このような場合、どういった作りにするのがよいでしょうか。

〜 〜  /\  〜 〜  ももたろ(西海 桃太郎)   〜 〜  
 〜 \((  )/ 〜   mailto:[E-MAIL ADDRESS DELETED] 〜 〜 
  〜 〜 〜 〜 〜 〜 http://www.momo-lab.net/  〜 〜





Seasar-user メーリングリストの案内