首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >in子句中包含参数列表的PreparedStatement

in子句中包含参数列表的PreparedStatement
EN

Stack Overflow用户
提问于 2010-06-24 11:26:40
回答 13查看 315.8K关注 0票数 119

如何在JDBC中执行查询时为preparedStatement中的in子句设置值。

示例:

代码语言:javascript
复制
connection.prepareStatement("Select * from test where field in (?)");

如果这个in-子句可以容纳多个值,我该怎么做呢?有时我事先知道参数列表,有时我不知道。如何处理此案?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-06-24 11:34:13

我要做的是添加一个"?“对于每个可能的值。

代码语言:javascript
复制
var stmt = String.format("select * from test where field in (%s)",
                         values.stream()
                         .map(v -> "?")
                         .collect(Collectors.joining(", ")));

另一种选择是使用StringBuilder (这是10+多年前的原始答案)

代码语言:javascript
复制
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 = ... 

然后愉快地设置参数

代码语言:javascript
复制
int index = 1;
for( Object o : values ) {
   pstmt.setObject(  index++, o ); // or whatever it applies 
}
票数 121
EN

Stack Overflow用户

发布于 2016-04-05 16:26:55

您可以使用下面的javadoc中提到的setArray方法:

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int, java.sql.Array)

代码:

代码语言:javascript
复制
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();
票数 62
EN

Stack Overflow用户

发布于 2010-06-24 11:35:50

不能将查询中的?替换为任意数量的值。每个?只是单个值的占位符。要支持任意数量的值,必须动态构建一个包含?, ?, ?, ... , ?的字符串,其中问号的数量与in子句中需要的值的数量相同。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3107044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档