【发布时间】:2010-12-31 04:49:51
【问题描述】:
是否可以通过Jdbc模板在SQL查询中生成任意“in()”列表:
示例:
"select * from t where c in (#)" ,但是 '#' 可以是仅在运行时知道的任意值列表。
【问题讨论】:
标签: spring
是否可以通过Jdbc模板在SQL查询中生成任意“in()”列表:
示例:
"select * from t where c in (#)" ,但是 '#' 可以是仅在运行时知道的任意值列表。
【问题讨论】:
标签: spring
是的,如果您使用带有命名参数的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 查询。
【讨论】:
(rs, rowNum) -> {...} 代替 new RowMapper<SomeObject>() { ... }。
在 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())
【讨论】:
SimpleJDBCTemplate 现已弃用。您可以改用 NamedParameterJdbcTemplate。
示例代码如下。
如果您有多个不同类型的参数,您可以
使用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 的 IN 语句中使用的列表。
【讨论】: