2017-08-12 78 views
0

我有下面的代碼,我似乎無法弄清楚如何逃避我命名參數周圍的單引號。在生成的查詢,我需要在它的兩邊單引號:NamedParameterJdbcTemplate Oracle SQL如何在命名查詢中轉義單引號?

 public List<Vehicle> findByApplicationId(String applicationId) { 
      // example application id is a string like 12345 
      MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource(); 
      sqlParameterSource.addValue("applicationId", applicationId); 

      StringBuilder stringBuilder = new StringBuilder(); 
      stringBuilder.append("SELECT make, model"); 
      stringBuilder.append(" FROM vehicle"); 
      stringBuilder.append(" WHERE model IN (SELECT id FROM auto WHERE model_app IN ("); 
      stringBuilder.append(":applicationId"); 
      stringBuilder.append("))"); 
      // in the resulting query the applicationId must appear 
      // as '12345', meaning with single quotes around it 

      return jdbcTemplate.query(stringBuilder.toString(), sqlParameterSource, 
        // lambda used as row mapper 
        (resultSet, rowNumber) -> {... 
    ... 

我試圖把周圍的名稱參數雙單引號爲stringBuilder.append("'':applicationId''");,沒有工作。基於我在SO上看到的其他答案,我嘗試了單引號和許多其他單引號和雙引號的組合。似乎無法得到它。

+1

如果將值綁定爲字符串,則不需要單引號。 –

+0

@AlexPoole我嘗試過沒有引號。雖然通過調試日誌查看生成的查詢時,named參數可以解析,但我仍然無法獲取數據,而在SQL客戶端中,將完全相同的查詢放在pulls數據中。所以我認爲在查詢中沒有正確發送一些東西。你能通過一個小例子來表明你的意思嗎?我甚至試圖用不同的引用組合來製作命名參數和整數。有時它會解決,但引號數量錯誤,其他時間查詢被認爲是不好的SQL語法。 –

+1

單引號不是答案。你會急於獲得字符串值'':applicationId'',它不會被視爲一個綁定變量,並且實際值12345不會被使用。您是否可能只是在SQL客戶端中插入要查找的數據並且沒有提交?只是一個想法。否則,什麼是列數據類型? –

回答

0

原來我的問題根本不是單引號,正如Alex Poole所建議的(謝謝Alex)。這是我的Java字符串需要被轉換爲Oracle類型CHAR(17)。之後,我沒有引號,單或雙,是必要的,我的命名參數正確解決和查詢工作。

相關問題