使用数组的Java SQL Prepared语句问题和其中... IN列表[重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我有一个包含字符串的数组列表:

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不兼容的数据类型

java sql arraylist prepared-statement
3个回答
1
投票

问题可能是使用pstatement.setArray(1, connection.createArrayOf("varchar", data)); 作为占位符。

试试?

发现...WHERE repos.reposart IN (?)


1
投票

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并不简单。我把这作为锻炼给你,以防你想要超越。


0
投票

是的,就像别人说的那样?是问题。

在这种情况下,我这样做:

    //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
    }

那不好。但在这种情况下超级高效。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.