2009-12-30 5 views
30

Ist es möglich, willkürlich "in()" Listen in einer SQL-Abfrage durch Jdbc Vorlage zu generieren: "von t, wobei c in (#) wählen *", aber '#' konnteWie erstelle ich eine dynamische "in (...)" sql Liste durch Spring JdbcTemplate?

:

Beispiel sei eine willkürliche Liste von Werten, die nur zur Laufzeit bekannt sind.

+0

mögliche Duplikate von [Wie IN() SQL-Abfragen mit Spring's JDBCTemplate effektiv ausgeführt werden?] (Http://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs- jdbctemplate-effectively) – Adam

Antwort

37

Ja, es ist möglich im Frühling, wenn Sie NamedParameterJdbcTemplate oder SimpleJdbcTemplate mit benannten Parametern verwenden. Liste Parameter können als java.util.List eingestellt werden:

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 diesem Fall Frühling intern erstellt die SQL-Abfrage mit der erforderlichen Anzahl der Platzhalter auf der Basis der Größe der aktuellen Liste, wenn benannte Parameter mit ? s ersetzt.

+5

Dies funktioniert nicht, wenn Ihre IN (...) Argumente keine Strings (Text) sind. Wenn Sie beispielsweise eine Liste auf diese Weise übergeben möchten, erhalten Sie den falschen Datentyp: java.lang.NumberFormatException: Für die Eingabezeichenfolge: "[2, 3, 4]" –

0

In Hibernate können Sie folgende Beispiel verwenden:

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

Die Frage war nicht Hibernate, sondern Spting JDBC Vorlage –

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

Beispielcode unten. Wenn Sie mehrere Parameter unterschiedlicher Art haben, können Sie Verwendung Object als Schlüssel, sonst benutzen, um Ihre 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()); 

Ihre sqlAllEmpl werden zwei Platzhalter, level - String und periodList - die eine Liste in der IN verwendet wird Aussage von sql.

Verwandte Themen