PreparedStatement“喜欢”模式匹配不适用于filepath

问题描述 投票:1回答:1

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

将目录路径传递给下面的方法总是返回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;
}

我已经验证了目录下的表文件。

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

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

有人可以帮我解决一下我在这里缺少的东西吗?

java h2
1个回答
0
投票

like-expression中使用的反斜杠被视为转义字符,因此可以转义%_。在你的情况下,你不需要它,所以你必须通过额外的反斜杠转义反斜杠或通过改变SQL来完全禁用转义:

SELECT MAX(VERSION) FROM TABLE WHERE FILENAME LIKE ? ESCAPE ''

...空字符串表示无法逃脱。有关详细信息,请参阅the H2 SQL grammar

© www.soinside.com 2019 - 2024. All rights reserved.