2016-11-10 14 views
0

解決策を指すリンクを見ましたが、最も関連性が高いのはHow to use Annotations with iBatis (myBatis) for an IN query? ですが、これもOracleドライバの解決策を提供しません。SQLプロバイダ内のMybatis AnnotationでIN句を使用する方法

public String getEmployees(Map<String, Object> params){ 

//Value hold by params params={empId={123,345,667,888}} 

StringBuilder sql=new StringBuilder(); 
sql.append("Select * from employee where emp_id in (#{empId}"); 

Mybatisはparamsの値を置き換えます。 しかし、値が代入されると、クエリは以下のようになります。 MyBatisのクエリで単一引用符を追加しているように、無効なクエリである

Select * from employee where emp_id in ('123,345,667,888'); 

修正プログラムでこの問題をどのように処理する必要がありますか? SQLインジェクションを防ぐために値を連結できません。

答えて

1

How to use Annotations with iBatis (myBatis) for an IN query?の回答では、postgresの解決策が得られます。リスト/配列の文字列表現は、データベースによって渡され変換されます。 Oracleはこれをサポートしていません。リストは、すべての値をバインドするために繰り返さなければなりません。

私の意見では、動的SQLは、次の答えでLordOfThePigsで説明されています。この場合に適応さは次のようになります。

@Select({"<script>", 
     "SELECT *", 
     "FROM employee", 
     "WHERE emp_id IN", 
      "<foreach item='emp' collection='empId'", 
      "open='(' separator=', ' close=')'>", 
      "#{emp}", 
      "</foreach>", 
     "</script>"}) 
List<Employee selectEmployees(Map<String, Object> params); 

@SelectProviderはJavaで構築されたSQL文字列を提供します。しかし、結合パラメータははるかに退屈になります。

+0

@Select( " ")私の場合、それも機能しています。 – zhuguowei

関連する問題