【问题标题】:How to generate a dynamic "in (...)" sql list through Spring JdbcTemplate?如何通过 Spring JdbcTemplate 生成动态“in (...)” sql 列表?
【发布时间】:2010-12-31 04:49:51
【问题描述】:

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

示例:

"select * from t where c in (#)" ,但是 '#' 可以是仅在运行时知道的任意值列表。

【问题讨论】:

标签: spring


【解决方案1】:

是的,如果您使用带有命名参数的NamedParameterJdbcTemplate 或SimpleJdbcTemplate,则可以在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));

在这种情况下,当用?s 替换命名参数时,Spring 会根据实际列表的大小在内部使用所需数量的占位符创建 SQL 查询。

【讨论】:

  • 如果您的 IN(...) 参数不是字符串(文本),这将不起作用。例如,如果你想以这种方式传递 List,你会得到 Wrong data type: java.lang.NumberFormatException: For input string: "[2, 3, 4]"
  • @ShivanDragon 在这种情况下有正确的方法吗?关于原始答案的一般说明。使用 java 8,您可以使用 lambda 格式 (rs, rowNum) -&gt; {...} 代替 new RowMapper&lt;SomeObject&gt;() { ... }。
【解决方案2】:

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

【讨论】:

  • 问题不是 Hibernate 而是 Spting JDBC 模板
【解决方案3】:

SimpleJDBCTemplate 现已弃用。您可以改用 NamedParameterJdbcTemplate。 示例代码如下。 如果您有多个不同类型的参数,您可以 使用Object 作为键,否则使用你的List&lt;T&gt;

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 的 IN 语句中使用的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多