2017-01-25 9 views
0

私のコードではI次のクエリ文字列を持っている:以下のようにネイティブクエリで呼び出されオラクル:ORA-00911:無効な文字

private static final String QUERY = format(
        " SELECT t2.address " + 
        " FROM schema.table1 t1 ," + 
        " schema.table2 t2 ," + 
        " schema.table3 t3   ,"+ 
        " schema.table4 t4 " + 
        " WHERE t2.uniqueIdentifier =:%s " + 
        " AND t1.parent_id = t2.parent_alias " + 
        " AND t3.company_id = t1.company_id " + 
        " AND t3.record_age = t2.recordAge " + 
        " AND t2.name = 'stubName' " + 
        " AND t4.pln_foi_id = t2.recordAge ",uniqueIdentifier); 

public String getAddress(String uniqueIdentifier){ 

     String result = null; 

     try { 
      Query query = persistence.entityManager().createNativeQuery(QUERY); 
      query.setParameter("uniqueIdentifier", uniqueIdentifier); 
      result = query.getSingleResult(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

私はこのクエリをテストする場合

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 

Caused by: java.sql.SQLSyntaxErrorException: ORA-00911: invalid character 

このエラーの原因は何ですか?クエリ文字列やコード内で問題の原因となることはありません。

+1

't2.uniqueIdentifier =:%s'これは正しくありません。 – XING

+0

これを拡張するか、答えをください – java123999

+0

可変のuniqueIdentifierにはどのような値が入っていますか?それは問題を引き起こしている可能性があります –

答えて

2

クエリが

... 
" WHERE t2.uniqueIdentifier = :uniqueIdentifier " 
... 

こととString.format()への呼び出しを削除する必要があります。最初のuniqueIdentifier変数の値によっては、SQLインジェクションの対象になるか、setParameter()が機能しません。

説明:パラメーターを含むネイティブ照会がある場合は、照会内でパラメーターの名前を:(コロン)接頭部で指定する必要があります。パラメータfooを使用するには、クエリに:fooと入力し、パラメータの代わりに使用する値を指定するにはsetParameter("foo", value);を呼び出します。

+0

私はこれを試して、同じエラーが発生しています。私は、クエリの構文に何か他のものがあるはずです。 – java123999

+0

クエリと引数をログに記録して、SQLツールで手動で実行しようとしますか?彼らはしばしば構文エラーを強調表示することができます。それが失敗した場合は、コードをデバッグしてSQLExceptionを調べてみてください。クエリに問題のキャラクタのオフセットが含まれます。 –