2009-12-30 10 views
30

¿Es posible generar arbitraria "en()" listas en una consulta SQL a través de la plantilla Jdbc:¿Cómo generar una lista dinámica "in (...)" sql a través de Spring JdbcTemplate?

ejemplo:

"SELECT * FROM t donde c en (#)", sin embargo '#' podría ser una lista arbitraria de valores solo conocidos en tiempo de ejecución.

+0

posible duplicado de [Cómo ejecutar IN() consultas SQL con JDBCTemplate de Spring effectivly?] (Http://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs- jdbctemplate-effectivly) – Adam

Respuesta

37

Sí, es posible en Spring si usa NamedParameterJdbcTemplate o SimpleJdbcTemplate con parámetros nombrados. Lista de parámetros se puede configurar como un java.util.List:

List<String> list = new ArrayList<String>(); 

list.add("A"); 
list.add("B"); 
list.add("C"); 

List<SomeObject> result = simpleJdbcTemplate.query("SELECT * FROM t WHERE c in (:list)", 
    new RowMapper<SomeObject>() { ... }, 
    Collections.singletonMap("list", list)); 

En este caso la primavera crea internamente la consulta SQL con el número requerido de marcadores de posición en función del tamaño de la lista real cuando se reemplaza con parámetros con nombre ? s.

+5

Esto no funciona si sus argumentos IN (...) no son cadenas (texto). Por ejemplo, si quiere pasar una Lista de esta manera, obtendrá Tipo de datos incorrecto: java.lang.NumberFormatException: Para la cadena de entrada: "[2, 3, 4]" –

0

En Hibernate, puede utilizar siguiente ejemplo:

if(tenors != null && tenors.length >0) 
      sql.append(" and ip.tenor_id in (:tenors)"); 

..... 


if(tenors != null && tenors.length >0){ 
    query.setParameterList("tenors", tenors);         
} 
..... 
SQLQuery query = (SQLQuery) getSession().createSQLQuery(sql.toString()) 
+2

La pregunta no era sobre Hibernate, sino Spting JDBC modelo –

0
SimpleJDBCTemplate is depricated now. You can use NamedParameterJdbcTemplate instead. 

Código de la muestra se encuentra por debajo. Si tiene varios parámetros de diferente tipo se puede uso Object como la clave, de lo contrario utilizar sus List<T>

String sqlAllEmpl = queryLoader.getProperty("allEmployeesByLevelAndPeriod"); 
     Map<String, Object> paramMap = new HashMap<String, Object>(); 
     paramMap.put("level", levelStr); 
     paramMap.put("periodList", periodList); 

     gridList = namedParameterJdbcTemplate.query(sqlAllEmpl, paramMap, new YourRowMapper()); 

sus sqlAllEmpl tendrá dos marcadores de posición, level - cuerda y periodList - que es una lista utilizada en la EN declaración de sql.

Cuestiones relacionadas