2009-12-30 78 views
30

是否有可能 “在()” 中通过JDBC模板中的SQL查询列表生成任意:如何通过Spring JdbcTemplate生成动态“in(...)”sql列表?

例如:

“选择T *,其中c在(#)”,但是 '#' 可能是仅在运行时已知的值的任意列表。

+0

可能的重复[如何有效地执行Spring的JDBCTemplate的IN()SQL查询?](http://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs- jdbctemplate-effectivly) – Adam 2012-02-29 00:50:41

回答

37

是的,如果您使用带有命名参数的NamedParameterJdbcTemplateSimpleJdbcTemplate,则可以在Spring中使用。列表参数可以设置为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)); 

在这种情况下,春季内部创建与所需数量的基础上与?小号更换命名参数在实际列表的大小的占位符的SQL查询。

+5

如果您的IN(...)参数不是字符串(文本),则这不起作用。例如,如果你想以这种方式传递一个List ,你会得到错误的数据类型:java.lang.NumberFormatException:对于输入字符串:“[2,3,4]” – 2011-09-28 11:40:45

0

在Hibernate中,你可以使用下面的示例:

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

问题不是关于Hibernate,而是Spting JDBC模板 – 2013-08-16 08:42:18

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

示例代码如下。 如果您有不同类型的多个参数,你可以 使用Object为重点,以其他方式使用您的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()); 

您sqlAllEmpl将有两个占位符,level - 串和periodList - 这是在中使用的列表sql语句。