ibatis를 이용한 쿼리좀 봐주세요ㅠㅠ 0 6 2,487

by jini [2013.09.10 14:43:14]



해당 쿼리는  
시작날짜(stDate), 종료날짜(edDate), 검색키워드(keyword), 반경거리(range), x, y좌표 의  검색조건
    property를 가지는 쿼리문입니다.

<parameter class="haspmap">
SELECT RNUM, TO_CHAR(REG_DATE,'YYYY-MM-DD HH24:MI:SS') AS REG_DATE, 
R_VALUE, LOC_X, LOC_Y, U_ID, LOC_ADDR, F_NAME, STATUS
FROM(
SELECT ROWNUM AS RNUM, TO_DATE(REG_DATE,'YYYY-MM-DD HH24:MI:SS') AS REG_DATE, 
TO_CHAR(R_VALUE, 'FM9999990.000') AS R_VALUE, LOC_X, LOC_Y, U_ID, LOC_ADDR, F_NAME, STATUS 
FROM CITIZEN_DATA
WHERE REG_DATE BETWEEN $stDate$ AND $edDate$
<dynamic prepend="AND">
<isNotEmpty property="keyword" prepend="AND">
LOC_ADDR LIKE '%$keyword$%' 
AND SQRT( 
POWER(LOC_X - ROUND(<iterate property="x" open="(" close=")" conjunction="OR">#[]</iterate>, 7),2)
+ POWER(LOC_Y - ROUND(<iterate property="y" open="(" close=")" conjunction="OR">#[]</iterate>, 7),2)
) <![CDATA[<=]]> #range# 
</isNotEmpty>
</dynamic>
)

검색날짜는 늘 세팅이 되어있기 때문에 dynamic조건이 없으며
키워드 검색시 list에 담긴 각각의 x, y좌표를 map에 담아 반경 100, 200, ... 500m 이내 데이터가 있는 경우에만
리스트를 출력하는 쿼리를 만드려고 합니다.

x, y좌표가 없는 경우에는 출력이 잘 되는데 <iterate 조건만 생기면 에러가 납니다ㅠㅠ 

참고로 map에 담긴 property는 다음과 같이 출력됩니다.
{stDate=2013091014, range=100, keyword=포항, edDate=2013091014,
y=[36.01888815251627, 36.00865185075951, 36.04183172813185],
x=[129.34312147483328, 129.3593413382186, 129.36565196037432]}

쿼리를 어떻게 수정해야 하나요ㅠㅠ
by 아발란체 [2013.09.10 14:54:53]
iterate를 어떤 목적으로 사용하신 것인가요?
iterate를 이용하여 반복 사용 연결 문자로 "OR"를 쓰시고 그 위에 라운드 처리를 하셨으니 당연히 오류 나겠죠?
ROUND안에는 문자가 들어갈 수 없습니다.

by 아발란체 [2013.09.10 14:55:51]
에러 로그 올려주시면 보다 정확한 답변을 드릴 수 있을 것 같습니다.

by jini [2013.09.10 15:47:39]
iterate 은 x, y 좌표가
y=[36.01888815251627, 36.00865185075951, 36.04183172813185],
x=[129.34312147483328, 129.3593413382186, 129.36565196037432]

이렇게 리스트에 담겨있는걸 하나씩 다 넣어서 비교하는 목적으로 만든 것입니다.
x,y는 대응하는 값으로 아래위로 하나씩이 한쌍입니다.

토드에서 그냥 검색을 한다면

select * from
citizen_data
where 1=1 and loc_addr like '%포항%'
and sqrt(power(loc_x-round('129.34312147483328', 7), 2) + power(loc_y-round('36.01888815251627', 7), 2)) <= 100

이런 쿼리가 나오는거죠.

loc_x는 컬럼으로 해당 컬럼에서 property 값인 x를 넣어 계산하는 것입니다.
loc_y는 y좌표값을 넣어 계산하는 거구요.

에러 로그는 나오지 않고 계속 로딩만 됩니다ㅠㅠ 에러가 있다면 편할텐데 에러는 뜨질않네요

by 아발란체 [2013.09.10 17:15:38]

요즘은 가독성이 떨어져서 iterate 를 쓰지 않고 있는데
기억으로는
 ROUND(<iterate property="x" open="(" close=")" conjunction="OR">#[]</iterate>
이렇게 쓰시면 X값에 따라
ROUND((VAL1 OR VAL2 OR VAL3) 식으로 되서 오류가 발생 할 것 같네요.
그리고 지금 보니 #[]식으로 되어 있네요?
myBatis가 아닌 iBatis 메뉴얼에 보면 #[] 식으로 바인딩하는 부분이 안보이던데.


by jini [2013.09.10 17:28:05]
iterate 를 쓰지 않는다면 반복되는 리스트 property는 어떻게 사용하나요??

by 아발란체 [2013.09.11 10:04:02]
프로그램단에서 해결 합니다. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입