2017-08-12 14 views
0

私は以下のコードを持っています。名前付きパラメータの周りに単一引用符をエスケープする方法がわかりません。結果のクエリでは、私はそれのいずれかの側に単一引用符を持っている必要があります:私は動作しませんでしたstringBuilder.append("'':applicationId''");のようにnameパラメータを二重引用符を入れて試してみた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) -> {... 
    ... 

。私はSOで見た他の答えに基づいて、一重引用符と一重引用符と二重引用符の他の多くの組み合わせを試しました。それを得るように見えない。

+1

値を文字列としてバインドする場合は、一重引用符は必要ありません。 –

+0

@AlexPoole私は引用符なしで試してみました。名前付きパラメータはデバッグログを介して結果のクエリを見ると解決されますが、データを取得することはありませんが、SQLクライアントでは同じクエリをプルデータに入れます。だから私は何かがクエリで正しく送信されていないことを示します。あなたは小さな事例の意味をお見せしますか?私は引用符の異なる組み合わせで、指定されたパラメータと整数を作成しようとしました。解決されることもありますが、間違った数の引用符では、クエリが悪いSQL文法とみなされることもあります。 –

+1

一重引用符は答えではありません。リテラル文字列値 '':applicationId'に対しては暗黙のうちにバインド変数として扱われず、実際の値12345は使用されません。おそらく、探しているデータを、それを見ることができ、コミットしていないSQLクライアントに挿入しましたか?ちょっとした考え。それ以外の場合は、列のデータ型は何ですか? –

答えて

0

私の問題はAlex Poole(Alexに感謝)の示唆どおり、一重引用符ではありませんでした。私のJava文字列をOracle型CHAR(17)にキャストする必要がありました。私が行った後、シングルまたはダブルの引用符は必要なく、私の名前付きパラメータは正しく解決され、クエリが機能しました。

関連する問題