CD9K1
352
2020-05-25 14:09:00 작성 2020-05-25 14:20:12 수정됨
14
514

스프링 mybatis 도저히 해결이 안됩니다


안녕하세요.


스프링 + jboss + postgreSQL 이용해서 개발 진행중이며

버전설정, db연동 확인 후 기능 구현중인데.. 어느부분이 문제인지 모르겠습니다.


컨트롤러 - 서비스 - 매퍼인터페이스 - sql.xml 

구조로 되어있고 db연동은 mybatis 사용했습니다.


현재 작업중인 부분이

검색기능부분인데, 뷰 부분에서 select 이용하여 원하는 카테고리의 검색값을 수행하게하는 부분인데요.

예를들면 게시판에서 제목으로 검색하거나, 날짜로 검색 하는 부분이요


이부분이 파라미터로 서비스부분까지 넘어오는걸 확인 후 진행중이고 일단 코드 첨부합니다



서비스


		if(searchValue == "" || searchValue == null) {
			tc = topMapper.noticeTotalCount();
		} else {
			PageUtil param = new PageUtil();
			param.setCategory(category);
			param.setSearchValue(searchValue);

			tc = topMapper.searchNoticeTotalCount(param);
			
			String ct = category;
			if (ct.equals("noticeTitle")) {
				tc = topMapper.searchNoticeNoTotalCount(param);
			} else if (ct.equals("noticeNo")){
				tc = topMapper.searchNoticeTitleTotalCount(param);
			}
		}



매퍼

        int searchNoticeTotalCount(PageUtil page);
	int searchNoticeNoTotalCount(PageUtil page);
	int searchNoticeTitleTotalCount(PageUtil page);



SQL.xml

<select id="noticeTotalCount" resultType="int">
	    Select 
	    	count(no) 
	    FROM sampletable 
	    WHERE no >= 1
	</select>
	<select id="searchNoticeNoTotalCount" parameterType="PageUtil" resultType="int">
	    Select 
	    	count(no) 
	    FROM sampletable 
    	    WHERE no = #{searchValue} 
	</select>
	<select id="searchNoticeTitleTotalCount" parameterType="PageUtil" resultType="int">
	    Select 
	    	count(no) 
	    FROM sampletable 
    	    WHERE title = #{searchValue} 
	</select>




기존에는 PageUtil 이라는 VO에 category랑 searchValue값을 넘겨줘서

SQL문에서 if문을 이용해서 진행을 했었고 내용은 

<select id="searchNoticeTotalCount" parameterType="PageUtil" resultType="int">
	    Select 
	    	count(no) 
	    FROM sampletable 
	    <if test="searchValue != '' and searchValue != null">
    	    WHERE 
		<if test="category eq 'noticeNo'">
			content = #{searchValue} 
		</if> 
		<if test="category eq 'noticeTitle'">
		    title LIKE CONCAT('%', #{searchValue}, '%')  
		</if> 
    	</if>
	</select>

뭘로해도 같은오류가 발생하고 해결이 안되는 상황입니다..

혹시 보고 문제있다면 지적좀 부탁드립니다 ㅠㅠ




오류코드 첨부합니다


HTTP Status 500 -
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: org.postgresql.util.PSQLException: ERROR: syntax error at end of input
  Position: 70
### The error may exist in "/C:/JBOSS/jboss-as-7.1.1.Final/standalone/deployments/프로젝트.war/WEB-INF/classes/mapper/noticeSQL.xml"
### The error may involve com.프로젝트.aaa.mapper.TopMapper.searchNoticeTotalCount-Inline
### The error occurred while setting parameters ### SQL: Select count(no) FROM sampletable WHERE ### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:734) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:847) root cause org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 ### The error may exist in "/C:/JBOSS/jboss-as-7.1.1.Final/standalone/deployments/프로젝트.war/WEB-INF/classes/mapper/noticeSQL.xml"
### The error may involve com.프로젝트.aaa.mapper.TopMapper.searchNoticeTotalCount-Inline
### The error occurred while setting parameters ### SQL: Select count(no) FROM sampletable WHERE ### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) com.sun.proxy.$Proxy16.selectOne(Unknown Source) org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:167) org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82) org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) com.sun.proxy.$Proxy28.searchNoticeTotalCount(Unknown Source) com.프로젝트.aaa.serviceImpl.TopServiceImpl.getPageInfo(TopServiceImpl.java:61)
com.프로젝트.aaa.controller.TopController.noticeList(TopController.java:40)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:734) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:847) root cause org.postgresql.util.PSQLException: ERROR: syntax error at end of input Position: 70 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:559) org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:410) org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63) org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434) com.sun.proxy.$Proxy16.selectOne(Unknown Source) org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:167) org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82) org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) com.sun.proxy.$Proxy28.searchNoticeTotalCount(Unknown Source) com.프로젝트.aaa.serviceImpl.TopServiceImpl.getPageInfo(TopServiceImpl.java:61)
com.프로젝트.aaa.controller.TopController.noticeList(TopController.java:40)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:734) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:847) note The full stack trace of the root cause is available in the JBoss Web/7.0.13.Final logs. JBoss Web/7.0.13.Final


0
  • 답변 14

  • CD9K1
    352
    2020-05-25 14:15:33 작성 2020-05-25 14:18:41 수정됨

    오류내용이 syntax error at end of input 이라고 되어있는데,

    SQL 부분에서 if test 로 category 값을 확인하는 부분을 건너뛰어서 발생하는 오류입니다..

    구문이 Select count(no) FROM sampletable WHERE 까지만 돌고 이후에 if문 적용이 안되어 발생하는데.. category 값을 java로 된 service 부분 출력해봐도 분명히 제가 유도한 파라미터 값이 출력되는데 

    if (ct.equals("noticeTitle")) {
    				tc = topMapper.searchNoticeNoTotalCount(param);
    			} else if (ct.equals("noticeTitle")){
    				tc = topMapper.searchNoticeTitleTotalCount(param);
    			}

    이렇게 if문안에 넣으면 인식을 못합니다. 

    왜이러는건지..

    -------------------------------------

    else if 부분에 noticeTitle이 위에 if문과 같이 적혀있는데 

    보시기 편하게 옮겨적다가 오타난 부분입니다 

  • 아낳앙
    162
    2020-05-25 14:19:58

    제가 쓰는 마이바티스 if문은

    <if test="category!= null and !category.equals('')"> 

    </if> 이런식인데 아마 if문 수식이 잘못되어서가 아닐까요

  • CD9K1
    352
    2020-05-25 14:33:49

    아낳앙


    <if test="category!= null and !category.equals('noticeNo')"> 

    no = #{searchValue} 

    </if> 

    <if test="category!= null and !category.equals('noticeTitle')"> 

        title LIKE CONCAT('%', #{searchValue}, '%')  

    </if>


    !표는 제외하고 이렇게 하라는 말씀이신거죠??



  • 아낳앙
    162
    2020-05-25 14:35:18
    <if test="category eq 'noticeNo'">
    이부분에서eq 부분을 equals('noticeTitle') 로 바꿔 보시라는 말이에욤
  • 아낳앙
    162
    2020-05-25 14:37:51

    그리구 로그에 sql 설정하셔서

    이런식으로 콘솔에 sql이 찍히도록 하시면 더 어디서 에러가 나는지 찾기 쉬울꺼같아요

  • CD9K1
    352
    2020-05-25 15:33:20

    아낳앙 ㅠㅠ답변감사합니다 


    쿼리는 지금 여기까지 찍히는중입니다..

    Select        count(no)       FROM sampletable                  WHERE
  • 길수응
    129
    2020-05-25 16:23:40

    where 뒤에 1=1 넣고 and 붙여보세용


    <select id="searchNoticeTotalCount" parameterType="PageUtil" resultType="int">
    	    Select 
    	    	count(no) 
    	    FROM sampletable 
    	    <if test="searchValue != '' and searchValue != null">
        	    WHERE 
                 1=1
    		<if test="category eq 'noticeNo'">
    			and content = #{searchValue} 
    		</if> 
    		<if test="category eq 'noticeTitle'">
    		    and title LIKE CONCAT('%', #{searchValue}, '%')  
    		</if> 
        	</if>
    	</select>
  • CD9K1
    352
    2020-05-25 16:42:36

    길수응 답변감사합니다


    말씀해주신대로 진행했는데 

    WHERE 다음에 1=1 이 있어 syntax error는 발생하지 않지만


    
                    <if test="category eq 'noticeNo'">
    			and content = #{searchValue} 
    		</if> 
    		<if test="category eq 'noticeTitle'">
    		    and title LIKE CONCAT('%', #{searchValue}, '%')  
    		</if>


    이부분이 적용이 안되고 있습니다 ㅠㅠㅠㅠ 아...머리터지겠네요


  • 길수응
    129
    2020-05-25 16:56:32 작성 2020-05-25 16:57:43 수정됨

    코드를 못보니 정확히는 모르겠구요.. 대충 예상을 해보자면

    category나 searchValue를 못찾는 거잖아요

    parameterType= "PageUtil" 쓰시고 있는데 이게 제대로 매핑이 안되있거나

    PageUtil에 getter가 없거나 정도??




  • 유리세계
    3k
    2020-05-25 17:04:44

    typeAlias 를 설정하신게 아니면 int, PageUtil 이거 인식을 못할겁니다

    경로를 써주셔야 해요. java.lang.Integer





  • CD9K1
    352
    2020-05-25 18:03:05

    길수응 

    맞습니다 카테고리를 못찾는거 같은데.. 

    PageUtil 이 존재하는 패키지를 typeAlias 로 정의해놨고 get set 도 존재하고있습니다.


    유리세계 

    mybatis 부분에 PageUtil의 상위 패키지까지 typealias 지정해 놨습니다 ㅠㅠ



    이상한게



    SELECT 
    	    	no AS noticeNo,
    	    	title AS noticeTitle, 
    	    	content AS noticeContent 
    	    FROM sampletable 
        	<if test="searchValue != '' and searchValue != null">
        	    WHERE 1=1 
    				<if test="category eq 'noticeNo'">
    					and no = #{searchValue} 
    				</if> 
    				<if test="category eq 'noticeTitle'">
    				    and title LIKE CONCAT('%', #{searchValue}, '%')  
    				</if>   
        	</if>
    	    ORDER BY no DESC 
    	    LIMIT #{listCount} OFFSET #{skip} 


    여기서 if test category 부분을 없애고 and no = #{searchValue} 이런식으로 적어주면

    이상없이 실행되고있습니다. 


    category 값을 자바부분에서 출력하면 정상출력은 되는데

    문자열에 비교하거나 변수에 문자값 주고 변수랑 비교해도 

    비교자체가 안되는거같습니다. 왜그럴까요.........




  • 길수응
    129
    2020-05-25 19:06:06
    음 아니면 no같은게 예약어일수도 있어요.
    컬럼명도 바꿔보시고 jdbcType=Integer,varchar도 붙여 보시고 그래도 안되면 sql문을 하나 더 만들어서 서비스단에서 content에 따라서 다른 sql을 실행해야 겠네요
  • 유리세계
    3k
    2020-05-26 09:08:04

    에러를 찍어주세요

  • CD9K1
    352
    2020-05-29 11:47:52

    오류코드 500에 본문에 적어놨습니다ㅠㅠㅠ


    결국 해결이 안돼서 프로젝트를 다시 생성하여 작업하니 지금은 또 정상적으로 작동하고있습니다

  • 로그인을 하시면 답변 을 등록할 수 있습니다.