2015-09-27 97 views
1

對於我的情況,我爲每個文件存儲了版本,試圖在目錄下查找最大文件版本。PreparedStatement「like」pattern matching not working for filepath

將目錄路徑傳遞給下面的方法始終返回0,因爲模式匹配失敗並伴有準備語句。

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。

任何人都可以請幫我看看我在這裏失蹤了什麼?

+0

如果什麼都找不到,它應該返回'-1'而不是'0' – silentprogrammer

+0

hi singhakash max函數總是返回一條記錄,如果沒有匹配則返回null,如果沒有匹配,rs.getObject(1)返回null rs.getInt(1)返回0,這就是爲什麼我得到0不是-1。 – ranjeetcao

+0

你如何調用這個方法,即什麼是'path'? –

回答

0

like-expression中使用的反斜槓被視爲轉義字符,因此可以轉義%_。在你的情況,你不希望出現這種情況,所以你必須要麼逃避額外反斜槓反斜槓或禁用通過改變SQL乾脆逃避:

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

...其中空字符串代表無處可逃 。有關更多詳細信息,請參閱the H2 SQL grammar