2009-12-30 14 views
30

E 'possibile generare arbitrario "in()" liste in una query SQL tramite JDBC modello:Come generare un elenco dinamico "in (...)" sql tramite Spring JdbcTemplate?

esempio:

"select * from t dove c in (#)", tuttavia '#' possibile essere un elenco arbitrario di valori noto solo al runtime.

+0

possibile duplicato di [Come eseguire query IN() SQL con Spring's JDBCTemplate efficacemente?] (Http://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs- jdbctemplate-effectivly) – Adam

risposta

37

Sì, è possibile in primavera se si utilizza NamedParameterJdbcTemplate o SimpleJdbcTemplate con parametri denominati. Elenco dei parametri può essere impostato come 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)); 

In questo caso Primavera crea internamente la query SQL con il numero di segnaposto in base alla dimensione della lista reale quando si sostituiscono i parametri denominati con ? s.

+5

Non funziona se gli argomenti IN (...) non sono stringhe (testo). Ad esempio se vuoi passare un elenco in questo modo, riceverai Tipo di dati errato: java.lang.NumberFormatException: Per stringa di input: "[2, 3, 4]" –

0

In Hibernate, è possibile utilizzare seguente esempio:

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 domanda non riguardava Hibernate, ma piuttosto Spting JDBC modello –

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

codice di esempio è al di sotto. Se si dispone di più parametri di tipo diverso si può uso Object come chiave, altrimenti utilizzare i 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()); 

tuoi sqlAllEmpl avrà due titolari di posto, level - archi e periodList - che è una lista utilizzata nel IN dichiarazione di sql.

Problemi correlati