java - 未在PreparedStatement上设置java.sqlite setObject

标签 java sql sqlite jdbc

我在这里错过明显的东西吗?

我有以下使用org.xerial:sqlite-jdbc:3.21.0对SQLite本地数据库执行查询的方法。

public List<HashMap<String, Object>> executeQuery(String sql, List<Object> vals) throws Exception {
    List<HashMap<String, Object>> rows = new ArrayList<>();
    Connection conn = getConnection();
    try (PreparedStatement stmnt = conn.prepareStatement(sql)) {
        if (!vals.isEmpty()) {
            for (int i = 0; i < vals.size(); i++) {
                stmnt.setObject(i + 1, vals.get(i));
            }
        }
        ResultSet rs = stmnt.executeQuery();
        ResultSetMetaData meta = rs.getMetaData();
        HashMap<String, Object> row;
        while (rs.next()) {
            row = new HashMap<>();
            for (int i = 0; i < meta.getColumnCount(); i++) {
                row.put(meta.getColumnName(i + 1), rs.getObject(i + 1));
            }
            rows.add(row);
        }
    } finally {
        putConnection(conn);
    }
    return rows;
}


但是,当我将以下SQL连同以下值一起传递到方法中时,它们不会被设置(但也不会引发异常)。就像它在内部分配它一样,却忘记了告诉数据库。

SELECT * FROM 'airlines' WHERE 'name' LIKE ? LIMIT 1

vals: size = 1 {"MyAirline"}


从调试中可以看到,它进入了setObject循环。

enter image description here

最佳答案

在ANSI标准SQL中,单引号(')用于分隔文字字符串,双引号(")用于分隔表/列名称。所以



SELECT * FROM 'airlines' WHERE 'name' LIKE ? LIMIT 1


真正的意思是“从文字字符串“ airlines”中选择文字字符串“ name”与参数提供的模式匹配的所有列”。

有趣的是,SQLite似乎足够聪明,可以将文字字符串“ airlines”解释为表名“ airlines”,但它仍在将“ name”解释为文字字符串。因此,对于“航空公司”中的每一行,它都将文字字符串“ name”与字符串值“ MyAirline”进行比较,并且该字符串从不匹配,因此ResultSet不包含任何行。

您的SQL命令文本应为

SELECT * FROM "airlines" WHERE "name" LIKE ? LIMIT 1


因此SQLite会将“名称”列的内容与值“ MyAirline”进行比较。

关于java - 未在PreparedStatement上设置java.sqlite setObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47496812/

相关文章:

使用套接字的 Java 代理

sql - 修复我的 SQL 查询 View

c++ - SQLite+Qt : Select from table always returns single row

javascript - 如何从 .ejs 获取值到 javascript 文件

java - 在 if 语句中更改状态是不好的做法吗?

java - onActivityResult 无法正常工作

java - 从网关调用的嵌套链回复多条消息

php - Laravel 4 插入后一对多重复条目

sql - 从不同于公共(public)模式的表中选择列

java - 如何显示 ArrayList<Bitmap> 中的图像 (SQLlte)