개발자

sql문 부적합합니다..

2024년 01월 31일조회 578

spring boot 4 에서 웹개발프로젝트를 진행중입니다.. jsp페이지에서 받아온 searchText값을 쿼리문으로 비교 후 foodinfolist를 반환해주는데 sql developer에서는 SELECT * FROM foodinfolist WHERE food_name LIKE '%' || '치킨' || '%'; 해당 코드가 정상동작 돼서 잘 검색하지만 mapper.xml에서 <mapper namespace="com.springproj.dietwebservice.repository.IFoodInfoDAO"> <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO">> <![CDATA[ SELECT * FROM foodinfolist WHERE food_name LIKE '%' || #{searchText} || '%' ]]> </select> </mapper> 해당 코드를 실행하면 sql문이 부적합합니다 라고 에러가 발생합니다.. 뭐가 문제인지 모르겠습니다.. searchText: 치킨 으로 데이터도 잘 담겨오는데.. 2024-01-31T16:24:22.500+09:00 ERROR 8208 --- [nio-8090-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]  : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00900: SQL 문이 부적합합니다 선배님들 조언부탁드립니다..

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 4

류호준님의 프로필 사진

완전히 같은 텍스트인데 문제가 있다면 특수문자 인코딩 문제라던지 세미콜론같은 부분을 의심 해 보시기 바랍니다. 디버깅의 기본은 파티셔닝 입니다. 쿼리를 좀 더 간단하게 만들어서 (특수문자등 제외) 그 상태에서는 돌아가는지 확인 해보는 등 문제가 있을 수 있는곳과 문제가 없는곳을 구분지어가면서 문제가 있을 수 있는 영역을 점점 좁혀가면서 디버깅 해 보세요

김태현님의 프로필 사진

김태현

작성자

서울it아카데미 컴퓨터정보전자과2024년 01월 31일

답변 감사합니다 조언 주신대로 한번 찾아보겠습니다!!

김태현님의 프로필 사진

<mapper namespace="com.springproj.dietwebservice.repository.IFoodInfoDAO"> <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO"> SELECT * FROM foodinfolist WHERE food_name LIKE '%' || #{searchText} || '%' </select> </mapper> 이렇게 수정했는데 정상작동 됩니다.. 답변 감사합니다..

남기웅님의 프로필 사진

CDATA 는 mybatis 에서 비교연산자( > 혹은 < )를 사용할 경우 xml 문법이 새로 열리거나 닫히는 문제때문에 보통 사용합니다. 그래서 비교연산자를 이용하는 경우가 아니르면 chatGpt 가 달아놓은 답변처럼 concat 함수를 사용해서 검색할 문자열을 만들면 됩니다. 그 외엔 sql developer 등의 툴에서 동작하는 쿼리를 거의 그대로 사용 가능합니다. 다만 먼저 말씀드린 경우처럼 비교연산자를 써야하는데 CDATA 문법이 번거롭고 가독성이 떨어질 경우를 대비해 mybatis에서는 &gt;(>) &lt;(<) 로 치환해서 사용 가능합니다.

!helloworld님의 프로필 사진

요즘도 mybais로 교육하나보네요ㅠㅠ 시장은 JPA인데

김태현님의 프로필 사진

김태현

작성자

서울it아카데미 컴퓨터정보전자과2024년 02월 12일

JPA도 교육했습니다! 다만 팀프로젝트에서 선택을 mybatis로 진행했습니다!! 추후 개인프로젝트때 같은 내용으로 jpa로 작업해보겠습니다 답변 감사합니다!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 01월 31일

XML 파일에서 변수 치환 기호를 사용할 때, CDATA 섹션 내부에서는 작동하지 않을 수 있습니다. 그리고 따옴표 없이 바로 변수를 사용해도 동작합니다. 아래와 같이 쿼리를 수정해 보세요. ```xml <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO"> SELECT * FROM foodinfolist WHERE food_name LIKE CONCAT('%', #{searchText}, '%') </select> ``` 또한 위 방식으로 여전히 문제가 발생한다면, SQL 쿼리의 잘못된 부분을 확인하기 위해 MyBatis 설정에서 로깅 레벨을 DEBUG 또는 TRACE로 설정하면 SQL 쿼리가 어떻게 생성되는지 확인할 수 있습니다. 이렇게 하면 문제의 원인을 좀 더 정확하게 파악할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!