[Seasar-user:7231] S2Dao?SQL????????

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 4月 13日 (金) 11:11:56 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 mailing list
[E-MAIL ADDRESS DELETED]
https://www.seasar.org/mailman/listinfo/seasar-user

-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: NotesDocAssentor.NOTE
型:         application/octet-stream
サイズ:     7682 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/seasar-user/attachments/20070413/d3316ece/attachment.obj 


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