[HIBERNATE 5.4] Space is not allowed after parameter prefix ':'

orm.xml 파일에 mysql 에서 사용하는 user variable을 사용할때 아래와 같은 오류가 발생한다.

TXT
Caused by: org.hibernate.HibernateException: Errors in named queries: failed because of: org.hibernate.QueryException: Space is not allowed after parameter prefix ':' [SELECT ... 생략]
  • Space is not allowed after parameter prefix ':'

xml 파일에 아래와 같이 user variable을 사용하는데, 변수에 값을 assign 하는 문법의 콜론과(:=) hibernate에서 query statement에 값을 바인딩할때 사용하는 문법이 서로 충돌한다.

SQL
INNER JOIN (SELECT @n := 1, @sbj := -1) var (mysql 문법) WHERE p.deleted = 'N' GROUP BY p.subject, p.seq HAVING rnum <= :topK (hiberate 문법)

user variable 뒤에 오는 콜론을 일반 문자로 인식해야 하는데 hiberate에서 named paramter 로 해석하면서 오류가 발생

해결

구글링해보면 user variable에 assign 하는 콜론에 두개의 backspace를 붙이라는 글들이 많다.

그러니까 아래와 같이 하라는 것

SQL
INNER JOIN (SELECT @n\\:= 1, @sbj\\:= -1) var (콜론 앞에 backspace 두개) WHERE p.deleted = 'N' GROUP BY p.subject, p.seq HAVING rnum <= :topK (여기는 붙이면 안됨)

자바 코드에 직접 쿼리는 입력하는 경우는 \:를 인식시키려면 백스페이스를 하나 더 붙여줘야해서 대부분의 문서가 두개의 backspace를 붙이라고 말한다.

하지만 현재 쿼리는 xml 에 작성했기때문에 backspace를 하나만 적어줘야 한다.

SQL
INNER JOIN (SELECT @n\:= 1, @sbj\:= -1) var (콜론 앞에 backspace 한개) WHERE p.deleted = 'N' GROUP BY p.subject, p.seq HAVING rnum <= :topK (여기는 붙이면 안됨)

결론

자바 코드에 쿼리를 작성했다면 2개, xml 에 작성했다면 1개