[HIBERNATE 5.4] Space is not allowed after parameter prefix ':'
orm.xml 파일에 mysql 에서 사용하는 user variable을 사용할때 아래와 같은 오류가 발생한다.
TXTCaused 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개