未在PreparedStatement上设置java.sqlite setObject

未在PreparedStatement上设置java.sqlite setObject,java,sql,sqlite,jdbc,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 ArrayL

我是不是漏掉了什么明显的东西

我使用
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;
}
我可以从调试中看到它进入到
setObject
的循环中


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

从“航空公司”中选择*,其中“名称”类似于?限制1
真正的意思是“从文字字符串'airlines'中选择文字字符串'name'与参数提供的模式匹配的所有列”

有趣的是,SQLite似乎足够聪明,可以将文字字符串“airlines”解释为表名“airlines”,但它仍然将“name”解释为文字字符串“它将文字字符串‘name’与字符串值‘MyAirline’进行比较,但从不匹配,因此结果集不包含任何行

您的SQL命令文本应该是

从“航空公司”中选择*其中“名称”类似?限制1
因此SQLite会将“name”列的内容与值“MyAirline”进行比较。

owww!!:)太棒了,现在开始工作了。非常感谢。
SELECT * FROM 'airlines' WHERE 'name' LIKE ? LIMIT 1

vals: size = 1 {"MyAirline"}