ResultSet 返回 PreparedStatement 参数而不是实际结果

ResultSet returning PreparedStatement parameter instead of actual results

我想从 MariaDB 数据库中获取数据并通过 Maven 安装了 MariaDB JDBC 连接器。以下代码将 PreparedStatement pstmt 数据的参数而不是实际的 row/cell 数据添加到组合框(参见代码片段,第 10 行)。这是我要解决的问题。如果重要的话,我的 table 由 1 个 int 和 4 个 varchars 组成。

代码片段(含行数):

// WRITTEN IN NORMAL JAVA 11
 1| Connection db = DriverManager.getConnection("jdbc:mariadb://localhost:3306/DB", "USER", "PASSWORD");
 2| PreparedStatement pstmt = db.prepareStatement("SELECT ? FROM companies;");
 3| pstmt.setString(1, ((JComboItem) companySelectFilterCategoryComboBox.getSelectedItem()).getValue()); // getValue() returns "email"; Combo Box is JComboBox<ComboItem>, ComboItem.groovy is below
 4| System.out.println(pstmt); // OUTPUT: sql : 'SELECT ? from companies;', parameters : ['email']
 5| ResultSet rs = pstmt.executeQuery();
 6| ArrayList<ArrayList<String>> list = ResultSetService.resultSetToArrayLists(rs); // This returns an ResultSet as an deep ArrayList (as ArrayList<ArrayList<String>>), see below
 7| System.out.println(ResultSetService.toString(rs)); //OUTPUT: [[email], [email]]

// This output is already wrong, should be: [[mail1@localhost], [mail2@localhost]]
// This is the above mentioned problem I want to fix.

 8| companySelectOptionsComboBox.removeAllItems();
 9| for (ArrayList<String> arr: list) {
10|    companySelectOptionsComboBox.addItem(arr.get(0));
11| }

ComboItem class 基本上只是一个具有 2 个字符串、一个键和一个值的对象。键是正在显示的字符串,值在后端使用(参见代码片段,第 3 行):

// WRITTEN IN GROOVY
class JComboItem {
    private String key;
    private String value;

    JComboItem(String key, String value)
    {
        this.key = key;
        this.value = value;
    }

    @Override
    String toString()
    {
        return key;
    }

    String getValue()
    {
        return value;
    }
}

这会翻译 ArrayList 中一行的每个单元格,并将它们放入另一个 ArrayList 中,returns 它(行列表)。错误可能出在此处,但这在脚本的另一部分中完美无缺(如果被问到,我会很乐意提供这部分,但不想让它膨胀 post)。唯一的区别是 tables,工作脚本的 table 由 3 个 varchars 组成:

// WRITTEN IN GROOVY
class ResultSetService {

    static ArrayList<ArrayList<String>> resultSetToArrayLists(ResultSet rs) throws SQLException {
        ArrayList<ArrayList<String>> list = new ArrayList<>()
        rs.beforeFirst()
        while (rs.next()) {
            ArrayList<String> row = new ArrayList<>()
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                row.add(rs.getString(i))
            }
            list.add(row)
        }
        return list
    }
}

过去 2 天我一直在查找这个问题,但找不到任何相关信息或类似问题。我最好的猜测是 ResultSetService.resultSetToArrayLists() 处的错误或 PreparedStatement/ResultSet 的错误使用(即使它在脚本的另一点起作用)。或者库中某处的实际错误。

不能使用占位符插入列名。有效查询 是:select 'email' from something。你必须连接的名字 列到 sql 字符串中。所以要三倍小心恶意用户可以 不要在那里注入 sql (例如使用枚举或其他类型的 允许列表)。