Posso pedir ao JDBCTemplate para expandir um parâmetro de lista para uso em uma cláusula in ()? [duplicado

StackOverflow https://stackoverflow.com/questions/3613881

  •  26-09-2019
  •  | 
  •  

Pergunta

Esta pergunta já tem uma resposta aqui:

Posso fazer algo assim:

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

... e passe em uma lista ou variedade de argumentos a serem expandidos para o meu parâmetro, ou seja:

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

Especificamente, estou usando as classes Spring e JDBCTemplate/SimplejdbcTemplate.

Foi útil?

Solução

Desculpe, não posso fazer isso. Você pode escrever um método de conveniência para fazer isso, mas não há setParameterList() Como Hibernate, até onde eu sei.

Outras dicas

Você pode fazer isso usando o nome do nome do nome do nome.

Com sua amostra, seria 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);

Encontre o código abaixo

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;

    }

Sim, você pode na primavera 3 usando um parâmetro nomeado.

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

Deve levar qualquer lista de primitivas e expandir a lista. Apenas tenha cuidado para que sua lista não ocorra sobre o tamanho máximo que seu banco de dados suporta. (O Limite Oracle é 1000). Algo assim deve 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top