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。
对于我的情况,我为每个文件存储了版本,试图在目录下找到文件的最大版本。
将目录路径传递给以下方法总是返回 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。