Java.sql.SQLException:无效的列索引。

3

我一直在尝试使用preparedStatement来选择数据并传递这些参数,但是出现了异常。

有谁能帮助我吗?以下是我的代码。

Connection connection = DBConnection.getConnection();
    String query = "select * from integrantes where nome like '?' or rm like '?'";
            ArrayList<Integrante> list = new ArrayList<>();
            try {
                PreparedStatement preparedStatement = connection.prepareStatement(query);
                preparedStatement.setString(1, ('%' + term + '%'));
                preparedStatement.setString(2, ('%' + term + '%'));
                JOptionPane.showMessageDialog(null, ((OraclePreparedStatement) preparedStatement).getOriginalSql());
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    list.add(new Integrante(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getInt(4)));
                }
            } catch(SQLException e) {
                JOptionPane.showMessageDialog(null, "Erro ao listar o(s) integrante(s)." + e);
            } catch(NullPointerException e) {
                JOptionPane.showMessageDialog(null, "Ocorreu um erro inesperado.");
            } catch(Exception e) {
                JOptionPane.showMessageDialog(null, "Ocorreu um erro no código.");
            }

            return list;

“select *” 是一种不好的 SQL 语句结构,而不是列出所有列名。我猜测你的查询结果并不会返回4个列,但这是无法确定的。 - Justin Cave
选择 id_integrante,nome,rm id_grupo from integrantes; 当我在 Oracle SQL Developer 中执行时,它也可以正常工作。 - João Victor Ferreira
这是三列而不是四列(id_gruponrm 列的别名)。 - Justin Cave
1个回答

4

使用PreparedStatement时,不要在将被替换为字符串的占位符周围加上引号。您的语句应该如下:

"select * from integrantes where nome like '?' or rm like '?'"

将问号视为文字处理,因此该语句没有参数,导致异常。将其更改为

"select * from integrantes where nome like ? or rm like ?"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接