2016-11-10 4 views
0

Я видел ссылки, указывающие на решение, но наиболее актуальным является How to use Annotations with iBatis (myBatis) for an IN query? , но даже это не обеспечивает решение для драйвера Oracle.Как использовать предложение IN с Mybatis Аннотация внутри поставщика SQL

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 заменяет значения из параметров. Но когда значение подставляется, запрос становится чем-то ниже.

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

Это недопустимый запрос, так как mybatis добавил одинарные кавычки в запросе.

Как мне решить эту проблему для исправления? Я не могу объединить значения, потому что для предотвращения SQL Injection.

ответ

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 предоставляет SQL строку, сформированную в Java. Но привязывающие параметры становятся намного более утомительными.

+0

@Select (« ") В моем случае это тоже работа. – zhuguowei