라그랑주
10
2020-03-25 14:21:26
36
745

안녕하세요.. mybatis 하다가 막혀서 질문 드립니다..


안녕하세요 초보입니다.

스프링없이 간단하게 mybatis (마이바티스) 만 사용해 쿼리문을 날려서 데이터베이스에서

자료를 가져오려고 하는데요.

사용버전은 mybatis.3.4.1 입니다.

일반적인 쿼리문은 잘 되는데 동적쿼리 하려고 if문을 사용하면 문제가 생기네요.


쿼리문은 대략 이런식입니다..

<mapper namespace="T1">

<select id="getList" resultType="hashmap" parameterType="hashmap">

SELECT * FROM OPRUSR

<where>

    <if test="usr_id == '111'">

쿼리문..

</if>

    <if test="usr_name == '111'">

쿼리문..

</if>

</where>

</select>

</mapper>


Java 메인쪽에서는

HashMap param = new HashMap();

param.put("usr_id", "john123");

param.put("usr_name", "john");

ConnDatabase c = new ConnDatabase();

c.testB("T1.getList", param);


대략이런식으로 간단하게 2개 파라미터 담아서 넘깁니다.


그럼 계속 There is no getter for property named 'usr_id' in 'class java.lang.String'

이라는 에러메시지가 뜨면서 안되네요..

이게 String에는 Getter가 없다고 안되는건 알겠는데.. 뭘 어떻게 해야할지 모르겠네요..


저기서 if구문만 다 빼면 잘됩니다..


제가 검색하면서 나름 이것저것 다 해봤는데.. 안되더라고요..


_parameter 로 받으면 2개 3개는 못받고 1개만 받아지는거 같고요

그리고 객체 따로 만들어서 해봤는데도 저 메시지가 계속 뜹니다..


객체는 그 map 에 put 할때 따로따로 안하고

usr_id , usr_name 을 맴버변수로 가지는 클래스를 만들어서 거기 Getter/Setter 생성해주고

그 만든 클래스를 객체로 만들어서 그거를 map에 put해서 해봤는데도 결과가 똑같았어요..

UsrVo uv = new UsrVo();

uv.setUsrId("john123");

uv.setUsrName("john");

param.put(uv); 

이런식으로요..


뭔가 제가 착각하거나 크게 잘못알고 있는걸까요..?

어떻게 해야할지 알려주시면 감사하겠습니다 ㅜㅜ...

0
0
  • 답변 36

  • 이설란
    3k
    2020-03-25 14:36:22

    단순 코드만 보면 가장 이상한건

    c.testB("T1.getList", param);

    이구문입니다.


    <select id="getList" resultType="hashmap" parameterType="hashmap">
    리턴타입이 존재하는데 리터을 받아주질 않아요. 게다가 형태도 없이요.

    이련경우 List<hashMap<Stirng, Objcect> getList = c.testB("T1.getList", param);

    이런식으로 사용해야 return 된 값을 받을 텐데

    리턴값을 받아주는 getter가 없으니 이런 현상이 일어난게 아닐까 추측해봅니다.

    리턴이 필요없는 insert update delete 는 void로 가능하여 에러가 안나게 아닐까 추측해봅니다.


    0
  • 라그랑주
    10
    2020-03-25 14:45:37

    public void testB(String id, HashMap param) {

      String re = "my/util/db/mybatis.xml";

      InputStream in = Resources.getResourceAsStream(re);

      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);

      SqlSession sqlSession = sqlSessionFactory.openSession();

      List l = sqlSession.selectList(id,param);

      sqlSession.close();

    }

    함수내부는 이런식으로 되있어서 List 의 l 에서 결과값을 받도록 되어있습니다..

    0
  • 이설란
    3k
    2020-03-25 15:09:56

    그래서 리턴받는 값이 있느냐는거죠.

    selectList 메서드 안에

    HashMap param = new HashMap();

    param.put("usr_id", "john123");

    param.put("usr_name", "john");

    ConnDatabase c = new ConnDatabase();

    c.testB("T1.getList", param);


    이거 있는거 아닌가요?

    0
  • 라그랑주
    10
    2020-03-25 15:24:19

    아뇨 sqlSession.selectList 이 메소드는 mybatis에서 제공해주는 거라 제가 만든게 아니에요..

    testB 메소드는 그냥 인자만 전달해줘요


    if문을 빼고 실행하면 List 의 l 변수에 결과값이 정상적으로 담깁니다..

    0
  • 치느님이진리
    477
    2020-03-25 15:47:24

    if 문에서 따옴표와 쌍따옴표 바꿔보세요.

    <if test='usr_id == "111"'>

    이렇게요.

    글자만 봐서 헷갈리는데, test 구간 전체를 따옴표(') 로 감싸시고 변수값을 쌍따옴표(")로 감싸보세요.

    0
  • 라그랑주
    10
    2020-03-25 15:52:31 작성 2020-03-25 15:53:00 수정됨

    //치느님이진리

    답변감사합니다.. 그런데 

    <if test='usr_id == "111"'>

    했는데 똑같은 오류가 나오네요..


    org.apache.ibatis.reflection.ReflectionException:

    There is no getter for property named 'usr_id' in 'class java.lang.String'

    0
  • 치느님이진리
    477
    2020-03-25 15:55:24 작성 2020-03-25 15:56:15 수정됨

    hashmap 이렇게 소문자만 입력해서 되는지는 모르겠네요.

    parameterType과 resultType을 정확하게 명시해보세요.

    parameterType="java.util.HashMap" resultType="java.util.HashMap"


    0
  • 이설란
    3k
    2020-03-25 15:56:49

    <if test='usr_id.equals("111")'></if>

    그렇다면 이건 어때요?

    0
  • 라그랑주
    10
    2020-03-25 16:00:31

    //치느님이진리

    //이설란


    답변 감사합니다.. 다 해봤는데


    org.apache.ibatis.reflection.ReflectionException:

    There is no getter for property named 'usr_id' in 'class java.lang.String'


    이 에러를 벗어날수가 없네요..

    0
  • 치느님이진리
    477
    2020-03-25 16:03:42

    그럼 진짜 마지막으로

    제네릭 지정해보세요.

    HashMap<String, Object> param = new HashMap<String, Object>();

    이것마저 안되면 -_-a

    0
  • 이설란
    3k
    2020-03-25 16:05:23

    user_id를 사용하는사용하는 부분을 다시 확인해보시겠어요. 공백이 있다거나...

    오타가 있을 수도 있어요.

    0
  • 이설란
    3k
    2020-03-25 16:08:49
    0
  • 이설란
    3k
    2020-03-25 16:13:06 작성 2020-03-25 16:15:26 수정됨

    설마...

        <if test="usr_id == '111'">

    쿼리문..

      여기서 생략해서 안보여주신 부분을...

      #{usr_id }  <<-- 이렇게 사용안하신건 아니시죠?

      </if>

    저기 생략된 SQL문도 같이 보여주시겠어요?

    0
  • 치느님이진리
    477
    2020-03-25 16:14:29

    전 보통 이렇게 합니다.


    // Controller
    HashMap<String, Object> param = new HashMap<String, Object>();
    param.put("user_name", "Honggildong");
    List<HashMap<String, Object>> selectResult = searchService.search(param);  // 서비스 호출
    
    // xml
    <select id="search" parameterType="java.util.HashMap" resultType="java.util.HashMap">
    select *
      from user_info
     where 1=1
    <if test='user_name != null and user_name != ""'>
      and user_name = #{user_name}
    </if>
    </select>

    위에서도 이야기했지만 싱글쿼테이션(따옴표) 와 더블쿼테이션(쌍따옴표) 위치 중요합니다.

    0
  • 라그랑주
    10
    2020-03-25 16:15:17

    //치느님이진리

    //이설란


    계속된 답변 감사드립니다..

    일단 오타는 없었고요. 제네릭 변경해도 똑같은 에러 나오네요..


    selectList 또는 selectOne 에 따라 달라지는게 있는거 같지만 저는 selectList1개만 사용중이고

    진짜 단순한 구문 만들어서 되는지 테스트만 해보는거라.. 복잡한것도 없는데... 

    안되니까 뭘 잘못했는지를 모르겠네요..

    0
  • 라그랑주
    10
    2020-03-25 16:22:19 작성 2020-03-25 16:23:34 수정됨

    //쿼리문

    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">
    SELECT * FROM OPRUSR	
    <where>			
      AND USR_END_SNO = '134'
     <if test='usr_id != null and usr_id != ""'>			
     AND USR_GROUP_CODE = #{usr_id}
     </if>
     <if test='usr_name != null and usr_name != ""'>
      AND USR_GROUP_CODE = #{usr_name}
     </if>
    </where>
    </select>



    //호출함수

    public void testB(String id, HashMap<String, Object> param) {
    		
    		try {			
    			
    			SqlSession sqlSession = sqlSessionFactory.openSession();
    			List<HashMap<String, Object>> selectResult = sqlSession.selectList(id,param);
    			
    			System.out.println(selectResult);			
    			sqlSession.close();
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		
    
    	}



    //메인 호출부분

    HashMap<String, Object> param = new HashMap<String, Object>();
    param.put("usr_id", "john123");
    param.put("usr_name", "john");
    ConnDatabase c = new ConnDatabase();
    c.testB("T1.getListB", param);


    이렇게 했습니다. 위에 치느님이진리 님께서 해주신거 그대로 복사 해서 했는데도 안되네요..

    저기서 if구문만 빼면 아주 잘됩니다..

    0
  • 치느님이진리
    477
    2020-03-25 16:33:34

    아무리 봐도 어디에 문제가 있는지 모르겠네요.

    DOCTYPE과 연관이 있는지는 모르겠는데, 전 더이상 도움을 드릴수가 없을것 같네요.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE mapper 
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="T1">
    
    </mapper>

    다른 고수님들께 토스합니다.

    0
  • 라그랑주
    10
    2020-03-25 16:41:58 작성 2020-03-25 16:48:47 수정됨


    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    


    똑같네요..


    //치느님이진리


    도와주셔서 감사합니다....

    0
  • 이설란
    3k
    2020-03-25 16:57:16

    진짜 소스상으로는 틀린게 없어서...

    귀찮으시겠지만 하나씩 테스트 해보시겠어요?

    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='usr_id != null '>

    AND USR_GROUP_CODE = #{usr_id}

    </if>

    </where>

    </select>

    이렇게 되는지 부터 확인해보시구요.


    반대로

    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='usr_id != " "'>  (<if test='usr_id != ""'> 앞에껀 공백넣었고 이건 없는거)

    AND USR_GROUP_CODE = #{usr_id}

    </if>

    </where>

    </select>


    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">

    SELECT * FROM OPRUSR

    <where>

    AND USR_GROUP_CODE = #{usr_id}

    </where>

    </select>



    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='usr_id != " "'> (<if test='usr_id != null '> 2개 다)

    </if>

    </where>

    </select>


    이렇게 테스트해보시겠어요?

    귀찮으시더라도 하나하나 체크해보는게 좋을듯해요.

    소스상으로는 문제가 너무 안보여요 ㅠㅠ

    0
  • 라그랑주
    10
    2020-03-25 17:17:06

    //이설란


    여러가지 케이스 감사합니다. 말씀하신 대로 모두 해보았으나

    if문이 들어가지 않은것만 정상적으로 실행되며 나머지는 모두 같은 에러가 나왔습니다..

    0
  • 이설란
    3k
    2020-03-25 17:54:04

    SELECT * FROM OPRUSR

    <where>

    AND USR_GROUP_CODE = #{usr_id}

    </where>

    이거는 이상없이 되고

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='usr_id != null '>

    AND USR_GROUP_CODE = #{usr_id}

    </if>

    </where>

    이건 안된다는거죠?

    마이바티스 버전을 알 수 있을까요?




    0
  • 이설란
    3k
    2020-03-25 17:59:17

    아!! 그리고 

    <select id="getListB" resultType="java.util.HashMap" parameterType="java.util.HashMap">

    이건 

    아이바티스에서

    parameterClass 로 사용되던건데

    그냥 hashmap으로 사용하셔요.

    0
  • 라그랑주
    10
    2020-03-25 18:17:59 작성 2020-03-25 18:29:48 수정됨

    //이설란


    답변 감사합니다.

    네 정확하게 말씀하셨습니다.


    버전은 3.4.1 이라고 제일 위에 적어놓았습니다~

    if문만 사용하면 에러가 나면서 안되네요..


    if문 표현식 내에서 사용하는 변수? 라고 해야하나 그게 문제인거 같은데

    어떻게 해야 될지 모르겠네요..


    일단 제가 원하는 결과는 여러개의 파라미터를 받아서 if문을 여러개 적어서 

    각각 다른 인자로 다른 조건을 사용해 동적쿼리를 만드는 것입니다만 if문부터

    막혀버렸네요..


    자바 기본 프로젝트에서 딱 마이바티스 1개만 추가해서 하는건데 잘 안되네요..

    0
  • 이설란
    3k
    2020-03-26 09:59:20

    어후...번전도 상관없는데...

    #{usr_id} 이게 되면 당연히 getter 가 된다는건데....

    if 문안에서만 안된다는게 진짜 이상하네요.

    테스트로

    <choose>

        <when test="usr_id != null">

          AND USR_GROUP_CODE = #{usr_id}

        </when>

        <otherwise>

          AND USR_GROUP_CODE = #{usr_name}

        </otherwise>

    </choose>


    초이스문을 사용해도 usr_id를 인식못하나요?


    0
  • 이설란
    3k
    2020-03-26 10:06:11

    아!! 그리고 에러를 나타내는 곳의 풀로그도 볼 수 잇을까요?

    이건 해결될때까지 거의 오기에 가깝네요.

    0
  • 라그랑주
    10
    2020-03-26 14:37:50

    //이설란


    거듭된 관심 및 답변감사합니다.

    뭔가 소스코드의 문제보다 환경설정의 문제는 없을까요?

    초이스문 사용시에도 동일 에러가 발생합니다. 위에 주신 구문 그대로

    복사 붙여넣기 해서 사용하였습니다.


    제 설정파일은 내용은 이렇게 구성되어있습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>  
      	<settings>
      		<setting name="logImpl" value="NO_LOGGING"/>
      	</settings>
      	<environments default="local">
      		<environment id="local">
      			<transactionManager type="JDBC"/>
      			<dataSource type="POOLED">
      				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
      				<property name="url" value="jdbc:oracle:thin:@***.***.***.**:****:XE"/>
      				<property name="username" value="****"/>
      				<property name="password" value="****"/>
      			</dataSource>
      		</environment>
      	</environments>
      	<mappers>
      		<mapper resource="com/my/files/sql/T1.xml"/>
      	</mappers>
      </configuration>


    전체 에러 로그는 아래와 같습니다.

    org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'usr_id' in 'class java.lang.String'
    	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:409)
    	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
    	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
    	at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
    	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
    	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
    	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
    	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2663)
    	at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)
    	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)
    	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
    	at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
    	at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
    	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
    	at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
    	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
    	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
    	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
    	at com.my.util.db.ConnDatabase.testB(ConnDatabase.java:71)
    	at com.my.app.main(app.java:15)


    0
  • 이설란
    3k
    2020-03-26 15:43:57

    설정상의 문제는 안보여요. 그렇다면 진짜 진짜...별거 아닌데...

    호출할 때 변수를 스네이크 방식이잖아요.

    이부분을 카멜방식으로바꿔보져

    param.put("usrId", "john123");

    param.put("usrName", "john");


    <if test='usrId!= null and usrId!= ""'>

    AND USR_GROUP_CODE = #{usrId}

    </if>

    이런식으로요.

    0
  • 라그랑주
    10
    2020-03-26 16:07:04

    //이설란


    일단 계속해서 답변해주셔서 감사합니다.. 변경해보았지만 결과는 같네요..

    초보라서 그런지 뭐가 잘못된건지 잘 모르겠네요.

    너무 고생하시는거 같아서 죄송하네요.. 

    그런데 #{usrId} 이렇게 하면 값을 잘 가져오는데.. 왜 if문안에서만 못가져오는지..

    mybatis 그만두고 ibatis나 다른거로 바꿔야 할까요..

    간단하게 mybatis 1개만 추가해서 쿼리문 돌리는 프로그램 만드려고 하는건데.. 잘 안되는군요..



    org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'usrId' in 'class java.lang.String'
    	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:409)
    	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
    	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
    	at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
    	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
    	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
    	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
    	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2663)
    	at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)
    	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)
    	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)
    	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
    	at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
    	at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
    	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
    	at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
    	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
    	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
    	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
    	at com.my.util.db.ConnDatabase.testB(ConnDatabase.java:71)
    	at com.my.app.main(app.java:15)
    


    0
  • 이설란
    3k
    2020-03-26 16:37:01

    지금 현재 sql mapper가 

    <select id="getListB" parameterType="hashmap" resultType="hashmap" >

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='usrId != null and usrId != ""'>

    AND USR_GROUP_CODE = #{usrId }

    </if>

    </where>

    </select>


    이렇게 되어 있는거 맞죠?


    이럼에도 자꾸 저소리가 나오면 다시 다른 테스트를 해볼게요.


    <select id="getListB" parameterType="hashmap" resultType="hashmap" >

    SELECT * FROM OPRUSR

    <where>

    AND USR_END_SNO = '134'

    <if test='value != null and value != ""'>

    AND USR_GROUP_CODE = #{value }

    </if>

    </where>

    </select>


    말도 안되는 미친짓인데...일단 이걸로 다시 테스트요 자꾸 스트링클래스라니까...

    0
  • 라그랑주
    10
    2020-03-26 17:12:57

    //이설란


    네 작성하신 글 본문의 위의 형태로 되있는것이 맞습니다.

    아래 형태로 실행했을 경우 에러는 나지 않는데요.

    그런데 저 상태에서 if문을 없애고 실행하면 value값이 뭐가 문제인지 에러가 납니다.

    value 라는 것은 if문 내에서는 사용할 수 있는거 같긴한데 (그런데 파라미터에 추가도 하진 않았죠..)

    #{value} 이건 사용 못하는거 같아요.


    위에 적어주신 그대로 사용하면 계속 나오던 에러는 안나는데

    아에 밑에 조건문 AND USR_GROUP_CODE = #{value } 없이 쿼리가 실행됩니다. 

    value가 null이라서 넘어가는듯해요. (조건이 거짓이라 구문실행이 안되는거같네요)


    이런식으로 if문을 뺴고 사용할 경우 에러가 납니다.

           <select id="getListB" resultType="hashmap" parameterType="hashmap">
    	SELECT * FROM OPRUSR	
    
    	<where>		
    		AND USR_GROUP_CODE = #{value}
    	</where>
    	</select>



    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='value', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
    ### The error may exist in com/my/files/sql/T1.xml
    ### The error may involve T1.getListB-Inline
    ### The error occurred while setting parameters
    ### SQL: SELECT * FROM OPRUSR     WHERE  USR_GROUP_CODE = ?
    ### Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='value', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
    	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    	at com.my.util.db.ConnDatabase.testB(ConnDatabase.java:70)
    	at com.my.app.main(app.java:15)
    Caused by: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='value', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
    	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:89)
    	at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93)
    	at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
    	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
    	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
    	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    	... 3 more
    Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
    	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:47)
    	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
    	... 12 more
    Caused by: java.sql.SQLException: 부적합한 열 유형: 1111
    	at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3963)
    	at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4596)
    	at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4578)
    	at oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1285)
    	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:45)
    	... 13 more
    



    흐흠 이제 뭐 어떻게 해야할까요..

    0
  • 이설란
    3k
    2020-03-26 17:31:19 작성 2020-03-26 17:45:42 수정됨

    이거...아무래도 프로젝트 컴파일이 뭔가 꼬인 것 같습니다.

    혹시 프로젝트 cleanup과 server cleanup 해보시진 않았죠?

    두개다 싹다 clean 해보시고

    Xml 파일을 빽업해두시고

    다시 생성해서 복사해보시겠어요?

     <select id="getListB" resultType="hashmap" parameterType="hashmap">

    현재 parameterType="hashmap"을 인식못하고 String으로 인식하고 있는거에요.

    그리고 순서도 parameterType="hashmap"을 resultType  앞에 넣어주시구요.

    테스트 부탁드릴게요.

    0
  • 이설란
    3k
    2020-03-26 17:59:04

    아 그리고 더 별거지같은건데..


    이걸로 usrGroupCode key을 넣고 다시 한번 해주세요.

    조건문에 usrGroupCode로요

    0
  • 라그랑주
    10
    2020-03-26 19:54:19

    //이설란


    <select id="getListB" parameterType="hashmap" resultType="hashmap">


    바꿔서 넣어봤는데 변함없네요.

    프로젝트 클린 및 재빌드도 해봤습니다.


    이걸로 usrGroupCode key을 넣고 다시 한번 해주세요.

    조건문에 usrGroupCode로요


    위에 하신말씀이 정확히 어떻게 하라는건지 잘 이해가 안되네요..

    0
  • 이설란
    3k
    2020-03-26 20:14:19 작성 2020-03-26 20:15:05 수정됨

    아 그게...

    <select id="getListB" parameterType="hashmap" resultType="hashmap" >

     SELECT * FROM OPRUSR 

     <where>   

        AND USR_END_SNO = '134'  

        <if test=usrGroupCode != null and usrGroupCode != ""'>   

         AND USR_GROUP_CODE = #{usrGroupCode }

        </if>

     </where>

    </select>

    이거랑

    param.put("usrGroupCode ", "john123");

    이렇게요.

    어디에서 글을 읽었는데 if문에서는 컬럼명과 같아야한다고해서요

    그러니까 카멜케이스는 되어 있을 테니

    key값을 저렇게 바꿔서 if문 테스트를 해보려고요.

    hashmap 타입으로 받아서 그냥 #{usrGroupCode }이렇게 사용하는건 상관없지만

    조건문에서는 다르다는 말을 본 것같아서 적었습니다.


    제 피시에 환경구성이 되어 잇으면 테스트를 제가 해보고 가르쳐드릴텐데...

    계속 테스트만 시켜서 죄송하네요.



    0
  • 라그랑주
    10
    2020-03-26 22:33:34 작성 2020-03-27 01:54:07 수정됨

    //이설란


    일단 답변 감사합니다.. 그런데요..


    뭔가 더더욱 미궁으로 빠져버렸어요..

    일단 혹시 몰라 요새 컴퓨터 오래 켜놨는데.. 재부팅 하고 다시 켜서 했는데요..

    님이 말씀하신대로 했는데 잘 되더라구요.. 그래서 아 저 규칙을 지켜야 되는구나 했는데..

    그런데 위에서 안되었던거 그걸 해도 되요.. 다 되요... 이게 무슨 일이지.. 


    진짜 이젠 뭐가 뭔지 모르겠네요...

    진짜 하면서도 여기 질문 올리기전에도

    프로젝트 클린 및 재빌드 엄청 많이 했는데.. 갑자기 왜 되는거지..

    빌드 제대로 된지 확인할 겸 해서 디컴파일러로 class 파일 변경되었는지도 확인했거든요..


    저기 위에 제가 안된다고 해서 적어논 코드 똑같이 복사 붙여넣기 했는데 에러 안나요;;

    뭔가 컴퓨터의 문제였던 걸까요...;; 


    끝까지 도와주셔서 정말 감사합니다.. 일단 해결 한거로;;

    0
  • 이설란
    3k
    2020-03-27 09:22:06

    아!! 하루 이틀이 지나서 재부팅은 무조건 했을거라는

    생각에....말씀을 안드렸는데....


    이번 현상은 에러메세지와 코드가 불일치 하는 현상이었는데

    프로젝트의 모든 코드를 클린하고 톰켓서버도 다시 클린 그래도 안되면

    재부팅이런순...


    진짜 가끔씩 이런 경우가 있어요. 어쨌든 잘 되서 다행이네요.

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