这个问题在这里已有答案:
我有一个包含字符串的数组列表:
ArrayList<String> anrs = new ArrayList<>();
现在我把它转换成这样的SQL数组:
final String[] data = anrs.toArray(new String[anrs.size()]);
final java.sql.Array sqlArray = connection.createArrayOf("varchar", data);
现在我想做一个像这样的准备好的声明:
statement = connection.createStatement();
String selectSQL = "SELECT * FROM rekopf INNER JOIN repos ON rekopf.rekopfnum=repos.Reposnum WHERE repos.reposart IN ?";
pstatement = connection.prepareStatement(selectSQL);
pstatement.setArray(1, sqlArray);
resultSet = pstatement.executeQuery();
但我得到了这个错误:
net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc ::: 4.0.1意外令牌:?需要:
此行发生错误:qazxsw poi
在这种情况下我的问题是什么?提前致谢。
更新当我这样尝试时:
pstatement = connection.prepareStatement(selectSQL);
然后我收到了这个错误
net.ucanaccess.jdbc.UcanaccessSQLException:转换时UCAExc ::: 4.0.1不兼容的数据类型
问题可能是使用pstatement.setArray(1, connection.createArrayOf("varchar", data));
作为占位符。
试试?
发现...WHERE repos.reposart IN (?)
java.sql.Array不等于任何数据类型的java数组。某些DB具有对集合和记录类型的内置支持(例如Oracle中的Varray)。 java.sql.Array可以方便地从客户端向这些数据类型(主要是过程PL / SQL的参数)发送数据。有关更多信息,您可能需要阅读有关所选数据库的集合,记录和类型支持。
根据您的需要,您只需要编写一个SQL,其中List中的每个元素都成为IN子句的一部分
例如:select * from user where name in('Hans','Joe','Jane');
here
将参数绑定到具有In子句的SQL的PreparedStatement并不简单。我把这作为锻炼给你,以防你想要超越。
是的,就像别人说的那样?是问题。
在这种情况下,我这样做:
//Your below code snippet,
ArrayList<String> anrs = new ArrayList<>();
// may be generated elsewhere as
// List<String> anrs = Arrays.asList("Hans", "Joe", "Jane");
// can be flattened to comma separated, quoted String
String inClause = anrs.stream().map(s -> "'"+s+"'")
.collect(Collectors.joining(","));
System.out.println("List<String> flattened for IN Clause -> "+inClause);
// which you will use to create SQL
String selectSQL = String.format("SELECT * FROM rekopf INNER JOIN repos "
+ "ON rekopf.rekopfnum=repos.Reposnum WHERE repos.reposart IN (%s)",
inClause);
java.sql.PreparedStatement pstatement =
connection.prepareStatement(selectSQL);
java.sql.ResultSet resultSet = pstatement.executeQuery();
while(resultSet.next()){
//TODO - process the result
}
那不好。但在这种情况下超级高效。
谢谢。