如何在Java中选择数组中的where变量?

如何在Java中选择数组中的where变量?,java,mysql,arrays,jdbc,Java,Mysql,Arrays,Jdbc,我一直在尝试从Java中的MySQL中选择值,其中var在数组中,在过去的3个小时里,我一直在阅读其他答案,其中一些答案已经标记为已接受的答案,但这些答案中没有一个解决了问题我尝试了许多示例,但我一直得到相同的异常: Exception in thread "main" java.sql.SQLFeatureNotSupportedException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Meth

我一直在尝试从Java中的MySQL中选择值,其中var
数组中,在过去的3个小时里,我一直在阅读其他答案,其中一些答案已经标记为已接受的答案,但这些答案中没有一个解决了问题我尝试了许多示例,但我一直得到相同的异常:

Exception in thread "main" java.sql.SQLFeatureNotSupportedException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLFeatureNotSupportedException(SQLError.java:1172)
    at com.mysql.jdbc.JDBC4Connection.createArrayOf(JDBC4Connection.java:52)
    at aero.Connecting.search(Connecting.java:150)
其中Connecting.java:150=
java.sql.Array-sqlArray=c.createArrayOf(“bigint”,data)
(与
int
VARCHAR
也存在相同的问题)

到目前为止,我所尝试的一切都不起作用,这是不可能按照我想要的方式(一个动态数组)完成的,但我不能接受这种说法,因为许多其他答案都说这是可能的

以下是我到目前为止所做的尝试:

第1版:

   public String createInListPattern(int n) {
    return StringUtils.repeat("?", ",", n);
}

     Connection c =get_conn();
              PreparedStatement s = c.prepareStatement("SELECT ID FROM users WHERE ID in ("+createInListPattern(2)+")");
          boolean status=false;
          int size=2;
            Integer[] data = new Integer[2];
            data[0]=13;
            data[1]=14;
             java.sql.Array sqlArray = c.createArrayOf("bigint", data);
                s.setArray(1, sqlArray);

        for (int i = 0; i < size; i++) {
            s.setInt(i + 1, data[i]);
        }
            ResultSet rs =s.executeQuery();
            if(rs.next()) { 
                System.out.println(rs.getInt("ID"));
                }
 Connection c =get_conn();
          PreparedStatement s = c.prepareStatement("SELECT ID FROM users WHERE ID in (?)");
      boolean status=false;
        Object[] data = new Object[2];
        data[0]=13;
        data[1]=14;
         java.sql.Array sqlArray = c.createArrayOf("bigint", data);
            s.setArray(1, sqlArray);
        ResultSet rs =s.executeQuery();
        if(rs.next()) { 
            System.out.println(rs.getInt("ID"));
            }
除上述版本外,我还尝试了以下几种:

  • (我的JDBCJAR版本是5.x)
正如我前面提到的,到目前为止,我收到的异常在所有尝试中都是相同的,似乎来自同一行(
c.createArrayOf(“bigint”,data)

有有效的解决方案吗


MySQL驱动程序显然没有实现/支持此功能。您需要通过不直接使用此API调用,而是在子句中创建自己的Concating值来解决问题


正如其他人指出的,此功能不受支持

一开始可能听起来很奇怪,但数据库的实现非常具体。您将在不同JDBC驱动程序的行为中发现许多差异

为了实现您的目标,您可以动态地组装和参数化准备好的语句。例如:

public static void main(String[] args) throws SQLException {
    Connection c = getConnection();

    // Build the SQL
    StringBuilder sql = new StringBuilder("SELECT id, name FROM sof.users WHERE id IN (");
    Integer[] data = new Integer[2];
    data[0]= 2;
    data[1]= 4;
    for (int i = 0; i < data.length; i++) {
        sql.append("?,");
    }
    // Delete the last comma
    sql.delete(sql.length()-1, sql.length());
    sql.append(")");

    // Assign prepared statement parameters
    PreparedStatement s = c.prepareStatement(sql.toString());
    for (int i = 0; i < data.length; i++) {
        s.setInt(i+1, data[i]);
    }

    // Output the results
    ResultSet rs = s.executeQuery();
    while (rs.next()) {
        System.out.println("id: " + rs.getInt("id") + "; name: " + rs.getString("name") );
    }
}
publicstaticvoidmain(字符串[]args)抛出SQLException{
连接c=getConnection();
//构建SQL
StringBuilder sql=new StringBuilder(“从sof.users中选择id和名称,其中id位于(”);
整数[]数据=新整数[2];
数据[0]=2;
数据[1]=4;
对于(int i=0;i

如果JPA是一个选项,那么许多JPA实现都会为您处理IN子句。

如果您创建一个数据对象数组作为Long array,并调用方法creatArrayOf并传递sql类型的大写BIGINT,那么问题仍然存在?是,它还保留了其他数据类型,如Varchar您的数据库是Oracle还是MySQL?MySQL数据库。根据Oracle网站上的文档教程,它提到了第一行MySQL,而javaDb不支持数组数据类型。这种方法已经实现了,这是我的IDE的一个屏幕截图:@HMA我同意你的说法,该方法在自动完成中列出,因为它的主体在JDBC4连接中可用;但我建议你仔细观察一下尸体的内部。他们显然在你的堆栈tracethanks上抛出了异常,你是对的,@Rafa answer分享了你关于不使用这种方法的见解。太棒了,这正是我想要的,谢谢,我不能放弃,我没有足够的钱reputations@HMA这与你的问题中一个问题的答案相同,因此我将其标记为副本。