2010-08-31 15 views
9

¿Puedo hacer algo como esto:¿Puedo pedirle a JDBCTemplate que expanda un parámetro de lista para usar en una cláusula in()?

select * from mytable m where m.group_id in (?) 

... y pasar de una lista o array de parámetros a ser ampliado a mi parámetro, es decir:

select * from mytable m where m.group_id in (1,2,3,4) 

Específicamente, estoy utilizando las clases Spring y JdbcTemplate/SimpleJdbcTemplate.

+1

Mi recuerdo es n - la '' marcador de posición significa un valor único como lo haría en SQL, por lo que no puede contener? una lista separada por comas –

+0

Posible duplicado de ambos http://stackoverflow.com/questions/1981683/how-to-generate-a-dynamic-in-sql-list-through-spring-jdbctemplate y http://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs-jdbctemplate-effectivly – Stewart

Respuesta

5

Lo siento, no puedo hacer eso. Puedes escribir un método conveniente para hacer eso, pero no hay setParameterList() como Hibernate, hasta donde yo sé.

+1

El método de conveniencia más simple, para una lista de tipos numéricos, puede ser list.toString(). replace ("[", "(") .replace ("]", ")") – Stewart

26

Puede hacerlo utilizando NamedParameterJdbcTemplate.

Con su muestra que sería algo como:

NamedParameterJdbcTemplate db = ...; 
List paramList = ...; 

Map idsMap = Collections.singletonMap("ids", paramList); 
db.query("select * from mytable m where m.group_id in (:ids)", idsMap); 
+1

¡Gracias! Vale la pena mencionar que se puede crear una NamedParameterJdbcTemplate desde una JdbcTemplate estándar: NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (jdbcTemplate); – Ivo

0

Sí se puede en la primavera 3 utilizando un parámetro llamado.

Ver http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-in-clause

Se debe tomar cualquier lista de primitivas y ampliar la lista. Solo tenga cuidado de que su lista no supere el tamaño máximo que admite su base de datos. (El límite de Oracle es 1000). Algo como esto debería funcionar:

List<Integer> ids = new ArrayList<Integer>(); 
    ids.add(1); 
    ids.add(2); 
    ids.add(3); 

    Map<String,Object> params = new HashMap<String, Object>(); 

    String sql = "SELECT PERSON.ID, PERSON.USERNAME, PERSON.EMAIL_ADDRESS, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.ACCOUNT_STATUS FROM PERSON WHERE ID IN (:ids)"; 
    params.put("ids",ids); 

    return getSimpleJdbcTemplate().query(sql, rowMapper, params); 
2

Por favor, encontrar el código de abajo

public Collection<Employee> findByIds(List<String> ids) { 

     Map<String, Object> params = new HashMap<String, Object>(); 
     params.put("ids", ids); 

     List<Employee> employees = namedParameterJdbcTemplate.query(
       "SELECT * FROM trn_employee where employee_id IN (:ids)", 
       params, 
       ParameterizedBeanPropertyRowMapper.newInstance(Employee.class)); 

     return employees; 

    } 
Cuestiones relacionadas