본문 바로가기
MySql

MySQL JPA 쿼리에서 콜론 문자 ':'이스케이프

by 베이스 공부 2020. 10. 29.
반응형

':'문자를 사용하는 JPA를 통해 기본 쿼리를 실행하려고합니다. 특정 인스턴스는 쿼리에서 MySQL 사용자 변수를 사용하고 있습니다.

SELECT foo, bar, baz, 
    @rownum:= if (@id = foo, @rownum+1, 1) as rownum, 
    @id    := foo                         as rep_id 
FROM 
    foo_table 
ORDER BY 
    foo, 
    bar desc 

JPA 코드 :

Query q = getEntityManager().createNativeQuery(query, SomeClass.class);
return q.getResultList();

그러나 이것은 공백과 함께 ':'를 따르는 것이 허용되지 않는 예외를 제공합니다. 백 슬래시로 이스케이프를 시도했지만 두 배로 늘려 이스케이프를 시도했습니다. 실제로 이것을 할 수있는 방법이 있습니까, 아니면 SOL입니까?

 

해결 방법

 

명명 된 매개 변수 접두사로 분명히 해석되어 쿼리 파서를 혼동하는 쿼리에서 콜론 문자를 이스케이프하는 표준 방법을 알지 못합니다.

내 제안은 가능하면 SQL 함수를 만들고 사용하는 것입니다. 공급자에 따라 다른 옵션 (다른 문자 사용 및 인터셉터에서 : 로 선택한 문자 대체)이있을 수 있지만 적어도 이전 제안은 공급자간에 JPA 코드를 이식 가능하게 유지합니다.


업데이트 : JPA 1.0 사양에 명명 된 매개 변수 및 기본 쿼리에 대한 "흥미로운"단락이 있습니다.

3.6.3 명명 된 매개 변수

명명 된 매개 변수는 식별자입니다. that is prefixed by the ":" symbol. 명명 된 매개 변수는 대소 문자를 구분합니다.

명명 된 매개 변수는 다음에 대한 규칙을 따릅니다. identifiers defined in Section 4.4.1. The use of named parameters applies to the Java Persistence query language, and is not defined for native queries. Only positional parameter binding may be portably used 네이티브 쿼리 용.

전달 된 매개 변수 이름 setParameter methods of the Query API에는 ":"접두사가 포함되지 않습니다.

이것은 실제로 도움이되지 않지만 귀하의 사례는 네이티브 쿼리의 ":"를 고려하지 않아야한다는 강력한 힌트입니다 (적어도 이스케이프하거나 감지를 비활성화 할 방법이없는 것은 아닙니다).

 

참조 페이지 https://stackoverflow.com/questions/4169582

 

 

반응형

댓글