[Seasar-user:3049] [S2DAO]複雑なSQLの生成

sato sato
2005年 12月 21日 (水) 11:14:58 JST


お世話になっています。
NSQ@佐藤です。

表題の通り、複雑なSQLを処理する場合の実装方法について教え頂けませんでし
ょうか?

作成したいSQLは以下のような物です。

SELECT *
  FROM TEST_TBL
 WHERE CITY = ?
   AND (    (NAME = ? AND AGE = ?)
         OR (NAME = ? AND AGE = ?)
         OR (NAME = ? AND AGE = ?)
         OR (NAME = ? AND AGE = ?)
         ・・・省略(Listの数だけループ)
         OR (NAME = ? AND AGE = ?)
        )
   AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
                      FROM TEST_TBL
                     WHERE CITY = ?
                       AND (    (NAME = ? AND AGE = ?)
                             OR (NAME = ? AND AGE = ?)
                             OR (NAME = ? AND AGE = ?)
                             OR (NAME = ? AND AGE = ?)
                             ・・・省略(Listの数だけループ)
                            OR (NAME = ? AND AGE = ?)
                           )
                      GROUP BY ID
※ここで取得したいデータ
名前(NAME),年齢(AGE)が該当するデータの中でIDに対して最大の履歴(SEQ)をも
つデータのみを取得したい。


このようば場合、バインド変数に対して値を与える良い方法はありますでしょう
か?
SQLコメントでループがないのでSQLの生成は出来なさそうだったので、

StringBuffer sql = new StringBuffer("Where CITY = " + city + "  AND ( 
");
for ( int i=0 ; i<list.size() ; i++ ) {
  HogeBean bean = (HogeBean)list.get(i);
  sql.append(" OR (NAME = " + bean.getName() + " AND AGE = " + ")");
}
sql.append(" )");
int firstOrIndex = sql.indexOf("OR");
sql.delete(firstOrIntex, firstOrIndes + 2);

として生成した条件を埋め込みたいと考えたのですが、この条件を

SELECT *
  FROM TEST_TBL
  ?
   AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
                      FROM TEST_TBL
                      ?
   
として、バインド変数にめ込んだ場合、条件が文字列のためシングルクォーテー
ション(')で囲まれてしまい希望したSQLになりません。

SELECT *
  FROM TEST_TBL
  'Where CITY = xxx AND XXXX省略'
   AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
                      FROM TEST_TBL
                      'Where CITY = xxx AND XXXX省略'
                      
何か良い解決方法はないものでしょうか?
=========================================================
株式会社 ネットスクエア
   佐藤 慎也 <E-mail:sato @ net-squares.com>
  
   〒733-0822
     広島市西区庚午中4丁目6−1セントラルビル3F
     http://www.net-squares.com/
     TEL:(082) 507 - 6266
     FAX:(082) 507 - 6267
 =======================================================
<< ISO文書管理は弊社のISO-SQUAREにお任せ下さい。       >> 
 =======================================================



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