[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 メーリングリストの案内