Los parámetros a pasar son el tipo int y la cantidad es incierta. ¿Cómo puedo pasar todos los parámetros a la vez en el caso de parámetros inciertos?

String SQL = "select * from table where enterprise_id in (?,?,?)";
int a,b,c = 1,2,3;//uncertain quantity
this.server.findBySql(SQL,a,b,c);

¿Hay una buena manera de evitar atravesar parámetros y empalmar las declaraciones de consulta?

0
Martin.J 23 ene. 2018 a las 06:50

3 respuestas

La mejor respuesta

Creo que la forma más fácil de pasar una lista es usar org.springframework.jdbc.core.namedparam.MapSqlParameterSource.MapSqlParameterSource () que puede tomar cualquier tipo de argumento para una declaración preparada.

Entonces, en su caso, puede modificar su SQL de esta manera para tomar el parámetro de lista:

String sql = "select * from table where enterprise_id in (:listOfInt)";.

Luego agregue la lista como parámetro:

MapSqlParameterSource sqlParams = new MapSqlParameterSource();        
sqlParams.addValue("listOfInt", Arrays.asList(1,2,3));

Pásalo a la instancia org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate para ejecutar la consulta de esta manera,

this.namedParameterJdbcTemplate.queryForList(sql, sqlParams);

Lo que le da un conjunto de resultados, además, esto supone que ha creado una instancia de NamedParameterJdbcTemplate a nivel de clase.

2
VPK 23 ene. 2018 a las 05:20

No soy un desarrollador de Java, pero pasarás un parámetro de matriz a una instrucción SQL IN:

String SQL = "select * from table where enterprise_id in (?)";
int[] array = {1, 2, 3};//uncertain quantity
this.server.findBySql(SQL, array);

Consulte Cómo usar una matriz de listas como un parámetro de declaración preparado para la forma correcta de hacer esto.

Tenga cuidado, si su matriz puede ser muy grande (quiero decir, muy muy grande), será mejor que la inserte en una tabla temporal usando una inserción masiva y luego use una instrucción JOIN (pero solo si puede alcanzar los límites de MySQL IN).

0
fso 23 ene. 2018 a las 04:02

Definitivamente podemos pasar una matriz de tipo int a procesos almacenados, pero no estamos seguros de las declaraciones.

Sin embargo, podemos salir con una solución como esta.

Digamos que los valores int provienen de int [] arrData.

StringBuffer arguments= new StringBuffer();

for(Integer value:arrData){
 if(arguments.toString().length!=0)
  arguments.append(",");
  arguments.append(""+value+"");
}

Y luego finalmente pasar valores separados por comas como entrada como esta.

String SQL = "select * from table where enterprise_id in (?)";
this.server.findBySql(SQL,arguments.toString());
0
Dark Knight 23 ene. 2018 a las 04:16
48393912