如何在JDBC中执行查询时为preparedStatement中的in子句设置值。
示例:
connection.prepareStatement("Select * from test where field in (?)");
如果这个in-子句可以容纳多个值,我该怎么做呢?有时我事先知道参数列表,有时我不知道。如何处理此案?
发布于 2010-06-24 11:34:13
我要做的是添加一个"?“对于每个可能的值。
var stmt = String.format("select * from test where field in (%s)",
values.stream()
.map(v -> "?")
.collect(Collectors.joining(", ")));
另一种选择是使用StringBuilder
(这是10+多年前的原始答案)
List values = ...
StringBuilder builder = new StringBuilder();
for( int i = 0 ; i < values.size(); i++ ) {
builder.append("?,");
}
String placeHolders = builder.deleteCharAt( builder.length() -1 ).toString();
String stmt = "select * from test where field in ("+ placeHolders + ")";
PreparedStatement pstmt = ...
然后愉快地设置参数
int index = 1;
for( Object o : values ) {
pstmt.setObject( index++, o ); // or whatever it applies
}
发布于 2016-04-05 16:26:55
您可以使用下面的javadoc中提到的setArray
方法:
代码:
PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();
发布于 2010-06-24 11:35:50
不能将查询中的?
替换为任意数量的值。每个?
只是单个值的占位符。要支持任意数量的值,必须动态构建一个包含?, ?, ?, ... , ?
的字符串,其中问号的数量与in
子句中需要的值的数量相同。
https://stackoverflow.com/questions/3107044
复制相似问题