2017-01-25 6 views
0

내 코드에서 나는 다음과 같은 쿼리 문자열을 가지고 다음과 같이 네이티브 쿼리라고오라클 : 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

variable uniqueIdentifier에 어떤 값이 있다고 가정합니까? 그것이 문제가 될 수 있습니다. –

답변

2

쿼리

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

을하고 String.format()에 대한 호출을 제거해야합니다; 첫 번째 uniqueIdentifier 변수의 값에 따라 SQL injection이 적용되거나 setParameter()이 작동하지 않습니다.

설명 : 매개 변수가있는 원시 (native) 쿼리가있는 경우 : (콜론) 접두사가있는 쿼리의 매개 변수 이름을 지정해야합니다. foo 매개 변수를 사용하려면 :foo을 쿼리에 넣고 setParameter("foo", value);을 호출하여 매개 변수 대신 사용할 값을 지정합니다.

+0

나는 이것을 시도하고 동일한 오류가 발생합니다. 나는 쿼리 구문에 뭔가 다른 것이 틀림 없어야한다고 생각한다. – java123999

+0

쿼리와 인수를 기록하고 SQL 도구에서 수동으로 실행 해 볼 수 있습니까? 종종 구문 오류를 강조 표시 할 수 있습니다. 실패 할 경우 코드를 디버그하고 SQLException 내부를 살펴보십시오. 쿼리에 문제가되는 문자의 오프셋을 포함합니다. –