Mybatis에서 부적합한 열 에러... 조언 부탁드립니다. 0 7 14,670

by 스나이피 [DB 기타] mybatis 부적합한 열 에러 [2014.07.10 19:05:47]


토드나 퀀텀DB에서 정상적으로 작동 하는 쿼리가 부적합한 열 에러를 발생시키고 있습니다.

System.out.println 메서드로 콘솔창에서 parameterType에 정의된 객체에 값이 들어가있는지 확인을 했는데

모든 변수에 값이 정확히 들어가 있는 상태구요...

매퍼xml안의 다른 매핑 구문들은 정상적으로 작동하는 상태입니다.

정상적인 쿼리가 mybatis에서 계속 에러가 나오니.. 몇시간째 이것만 붙잡고 있네요...

조언 부탁드립니다..

    


	
SELECT B_NUM, TITLE, CONTENT, WRITER, W_DATE, HIT, PASS, BOARD_DIV, GRP, SEQ, LVL 
FROM 
(SELECT COUNT(1) OVER()-R+1 AS B_NUM, TITLE, WRITER, PASS, CONTENT, W_DATE, GRP, LVL, SEQ, BOARD_DIV, HIT
FROM 
(SELECT ROWNUM R, TITLE, WRITER, PASS, CONTENT, W_DATE, GRP, LVL, SEQ, BOARD_DIV, HIT 
FROM 
(SELECT CASE WHEN LVL=0 THEN B_NO WHEN LVL>0 THEN NULL END B_NO, RPAD('└', LVL, '─')||TITLE TITLE, WRITER, PASS, CONTENT, W_DATE, GRP, LVL, SEQ, BOARD_DIV, HIT
FROM 
BOARD ORDER BY GRP DESC, SEQ)) WHERE ${ column } LIKE '%${ keyword }%')
WHERE BOARD_DIV=${ boardDiv } AND 
B_NUM BETWEEN ${ startNum } AND ${ endNum };
	

 

by 우리집아찌 [2014.07.11 09:06:35]

컬러명을 저렇게 치환되나요?

WHERE ${ column } => WHERE '컬럼명'

이렇게 될것 같은데요..

 


by 우리집아찌 [2014.07.11 09:53:13]

음 제가 반대로 알고있었군요..

COLUMN 조건에 대한 쿼리 제한적이니 DYNAMIC SQL로 하시는게 좋겠군요..

 

 


by 비주류 [2014.07.11 09:20:16]

#: PreparedStatement 파라미터 값 입력 (type에 따라 '' 감싸는 처리 포함)

$: 문자열 대체 라고 보면,

1. WHERE BOARD_DIV=${ boardDiv } 부분에서 문제가 될 것 같은데 아닌가요?
ex) WHERE BOARD_DIV=BBS
 
2. 가능한 경우 # { } 로 값을 입력하시는 게 좋지 않을까 생각이 듭니다.
모든 값에 대해 $ { } 로 처리하면 보안 문제도 있을 수 있고 값이 바뀔때마다 DB 에 부담이 될 것 같네요.
또 nullable 컬럼의 경우 ,jdbcType=VARCHAR 등을 지정해야 합니다.
(내부적으로 setNull(n, Types.VARCHAR) 처리)
 

by 스나이피 [2014.07.11 11:04:09]

우리집아찌님, 비주류님 답변 정말 감사합니다.

 우선 #으로 바꾸면 $으로 할때는 잘 되던 쿼리도 부적합한 열 인덱스 에러가 납니다. 

 동적 쿼리로 바꾸면 if문을 추가 해서 테스트 해보았는데 결국 파라메터로 받는 부분은 똑같아서 그런지

에러가 나더군요... ㅜㅜ

그리고 테이블 생성시에 파라메터로 받게되는 컬럼들은 모두 not null조건으로 만들어서 nullable 컬럼은 없는 것 같습니다.. ㅜㅜ


by 마농 [2014.07.12 16:36:04]

모주건 $ 를 쓰거나, 무조건 #을 써서 되는게 아니죠.

아래 비주류님 답글처럼

컬럼명에 해당하는 부분은 $ 를 사용해서 변환해야 하고

변수에 해당하는 부분은 # 을 사용해야 합니다.


by 비주류 [2014.07.11 11:46:48]
BOARD ORDER BY GRP DESC, SEQ)) WHERE ${ column } LIKE '%' || #{ keyword } || '%')
WHERE BOARD_DIV = #{ boardDiv } AND
B_NUM BETWEEN #{ startNum } AND #{ endNum };
 
위처럼 해보시고요, 안되면 실제 들어가는 변수값들을 알려주세요.

by DarkBee [2014.07.11 18:11:41]

부적합한 열유형{1111} 떨어지면 바인드 되는 변수에 null값이 들어갔다는 말이에요

그것을 피하기 위해선

 

#{boardDiv, javaType=String ,jdbcType=VARCHAR} 이런형태로 기술되어야 됩니다.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입