QA@IT

s2jdbcで、sqlファイルのIFコメント内が修正される。

5660 PV

SQLを編集して実行しようとしているのですが、SQLの構文が間違えてしまい、エラーとなってしまいます。
その原因が解らず、質問します。
尚、データベースはMySQLです。

java上で、以下のようなソースを記述しています。
尚、データベースはMySQLです。

HashMap hashMap = new HashMap();
hashMap.put("empIds","01,02");  //empIds
jdbcManager.selectBySqlFile(EmployeeDto.class,"sample.sql", hashMap);

sqlファイルの中は以下のようなものです。

select 
  *
from 
  t_emp
where
  delete_id is null
/*BEGIN*/
/*IF (empIds != null)*/
  AND emp_id in (/*$emp_id*/)
/*END*/
/*END*/

このSQLはエラーが出ます。
ANDが抜けてしまい、

delete_id is null emp_id in ('001','002')

となってしまうからです。
MySQLのログを確認したので、間違いなくそうなっています。

よくわからないのですが、なぜANDは取り除かれたのでしょうか?

私としては、

  delete_id is null AND emp_id in (/*$emp_id*/)

としたいのですが、どうすればいいのでしょうか?

回答

今回のようにWHERE句の最初の条件にIFがない場合であれば/*BEGIN*/〜/*END*/を使用する必要はありません。

単にAND emp_id in (/*$emp_id*/)/*IF*/〜/*END*/で囲むだけでOKです。

select 
  *
from 
  t_emp
where
  delete_id is null
  /*IF empIds != null*/
  AND emp_id in (/*$emp_id*/)
  /*END*/

なお、/*BEGIN*/〜/*END*/を使う場合は、WHERE句全体を囲むのが定石です。

編集 履歴 (0)

すみません、以下のようにしたら、うまく行きました。

select 
  *
from 
  t_emp
where
  delete_id is null
/*BEGIN*/
  AND
/*IF (empIds != null)*/
    emp_id in (/*$emp_id*/)
/*END*/
/*END*/

BEGINの中のIFは、最初は必ずANDを削除してしまうようなので、BEGINの後にANDを付け加えておきました。
お騒がせしました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。