해결된 질문
작성
·
628
2
안녕하세요. 김영한 강사님^^
여러 Querydsl 조건연산 메서드 호출 예제 Test 도중
다음과 같이 NULL 이 찍히는 현상을 발견했습니다.
Querydsl : member.age.notIn(20, 30, 40)
p6spy : m.age not in (? , ? , ?)
: m.age not in (30 , 40 , NULL);
저는 Querydsl 과 의존성 충돌이 생긴줄 알고,
spring-boot 버전을 2.3.4 -> 2.2.10 으로 다운그레이드 를 해봤는데 똑같은 애러가 나더라구요.
그래서 logging.level.org.hibernate.type: trace 옵션을 켜놓고 보니
BasicBinder : binding parameter [1] as [INTEGER] - [20]
BasicBinder : binding parameter [2] as [INTEGER] - [30]
BasicBinder : binding parameter [3] as [INTEGER] - [40]
이것 외 다른식에서도 다음처럼 NULL 이 찍힙니다.
Querydsl : member.username.eq("memberA").not()
BasicBinder : binding parameter [1] as [VARCHAR] - [memberA]
p6spy : m.username<>?
: m.username<>NULL;
Querydsl : member.username.like("%김%")
BasicBinder : binding parameter [1] as [VARCHAR] - [%김%]
p6spy : m.username like ? escape '!'
: m.username like NULL escape '!';
결국 p6spy 이 파라미터 값을 제대로 처리를 못해주는 현상인것 같은데,
혹시 이부분에 대한 알려진 해결방법이 있습니까?
혹시 제가 놓친게 있나 싶어서 여쭤보아요.
쓰고있는 p6spy 버전은 p6spy-spring-boot-starter:1.6.2 입니다.
읽어주셔서 감사합니다.
답변 4
4
ㅎㅎ 저건 검색해도 안나오더라구요 ㅋㅋ
JPA에서 코멘트를 추가로 출력하면 ?가 나오고, p6spy는 ?를 치환하니까 이렇게 된 것이라 가정하고, 코드를 여러번 돌려보면서 확인했습니다^^
4
안녕하세요. Truestar님^^
아마도 hibernate.use_sql_comments 옵션이 true로 설정되어 있을꺼에요^^
이 옵션을 넣으면 하이버네이트가 sql에 JPQL을 주석으로 추가해줍니다.
p6spy가 ?를 치완해야 하는데 이 추가된 JPQL 주석 때문에 앞 부분에서 치환이 끝나버리는 것이지요.
use_sql_comments 옵션을 제거해주시면 정상 동작합니다^^
use_sql_comments off
select * from member m where m.username = ?
select * from member m where m.username = 'hello'
use_sql_comments on
/* select m from member m where m.username = ? */ select * from member m where m.username = ?
/* select m from member m where m.username = 'hello' */ select * from member m where m.username = null
감사합니다.
1
1
저는 뭔가 거대한걸 발견한듯했지만 그런것이었군요ㅎㅎ
말씀대로 한방에 해결이 되었습니다.ㅠ
혹시 외람되지만.. 이런 문제는 어떤식으로 구글링 해야 찾을수 있을까요?
검색 키워드 조합 내공이 너무 딸려 문의드립니다.ㅠㅠ