PreparedStatement "like" 模式匹配不适用于文件路径

PreparedStatement "like" pattern matching not working for filepath

对于我的情况,我为每个文件存储了版本,试图在目录下找到文件的最大版本。

将目录路径传递给以下方法总是返回 0,因为 prepare 语句的模式匹配失败。

public int getMaxVersion(String path) {
    int version = -1;
    String query = "SELECT MAX(VERSION) FROM TABLE WHERE FILENAME LIKE ?";

    Connection connection = database.getConnection();
    PreparedStatement pstmt = null;
    if(connection != null) {
        try {
            pstmt = connection.prepareStatement(query);
            pstmt.setString(1, path + "%");
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()) {
                version = rs.getInt(1);
            }
        } catch (SQLException e) {
            log(e.getMessage());
        } finally {
            database.close(connection, pstmt);
        }
    }
    return version;
}

我已验证目录下存在 table 个文件。

SELECT * FROM TABLE;
FILENAME            SIZE    VERSION  
C:\sb\pub.jpg    1032    2
C:\sb\pub.jpg    1562    3
(2 row, 2 ms)

我在嵌入式模式下使用 h2 db。

任何人都可以帮我解决我在这里缺少的东西吗?

like 表达式中使用的反斜杠被视为转义字符,因此可以对%_ 进行转义。在您的情况下,您不希望这样,因此您必须使用额外的反斜杠转义反斜杠,或者通过将 SQL 更改为:

来完全禁用转义
SELECT MAX(VERSION) FROM TABLE WHERE FILENAME LIKE ? ESCAPE ''

... 其中空字符串表示无转义。有关详细信息,请参阅 the H2 SQL grammar