如何通过SpringJDBCTemplate生成动态的“in(…)”sql列表?

如何通过SpringJDBCTemplate生成动态的“in(…)”sql列表?,spring,Spring,是否可以通过Jdbc模板在SQL查询中生成任意in列表: 例如: 但是,从t中选择*其中c可以是仅在运行时已知的任意值列表 是的,如果您使用NamedParameterJdbcTemplate或带有命名参数的SimpleJdbcTemplate,则在Spring中是可能的。列表参数可以设置为java.util.List: 在这种情况下,Spring会根据实际列表的大小在内部创建具有所需占位符数量的SQL查询。在Hibernate中,使用?s替换命名参数时,您可以使用以下示例: if(tenors

是否可以通过Jdbc模板在SQL查询中生成任意in列表:

例如:


但是,从t中选择*其中c可以是仅在运行时已知的任意值列表

是的,如果您使用NamedParameterJdbcTemplate或带有命名参数的SimpleJdbcTemplate,则在Spring中是可能的。列表参数可以设置为java.util.List:


在这种情况下,Spring会根据实际列表的大小在内部创建具有所需占位符数量的SQL查询。在Hibernate中,使用?s替换命名参数时,您可以使用以下示例:

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())

SimpleJDBCTemplate现在已去润滑。您可以改用NamedParameterJdbcTemplate。 下面是示例代码。 如果有多个不同类型的参数,则可以 使用对象作为键,否则使用列表


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

如果您的in。。。参数不是文本字符串。例如,如果您想以这种方式传递列表,您将得到错误的数据类型:java.lang.NumberFormatException:对于输入字符串:[2,3,4]@ShivanDragon在这种情况下有正确的方法吗?关于原始答案的一般说明。在Java8中,您可以使用lambda格式rs,rowNum->{…}代替新的RowMapper{…}。问题的可能重复不是关于Hibernate,而是监视JDBC模板
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())
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());