org.apache.ibatis.binding.BindingException: Parameter 'offset' not found 에러

codemin·2024년 11월 13일
0

trouble_shooting

목록 보기
1/7

에러 메세지

org.apache.ibatis.binding.BindingException: Parameter 'offset' not found

원인

mybatis에서 잘못된 방식으로 파라미터를 사용해서 생긴 문제였다.

페이지네이션을 위해 paramMap(map)offset, pageSize를 넣었는데, myBatis 쿼리에서 paramMap.offset 같은 방식으로 값을 이용하려고 해서 생긴 문제였다.
넘길 파라미터가 여러 개인 경우 paramMap에 전부 넣거나 paramMap을 사용하지 말고 offset, pageSize를 각각 적어줘야 한다

잘못된 java 코드:

paramMap.put("offset", page.getOffset());
paramMap.put("pageSize", page.getPageSize());

(생략)

List<ExchangeListVO> exchangeList = exchangeMapper.selectSearchExchangeList(searchFilter, searchWord, startDate, endDate, paramMap);

잘못된 myBatis 쿼리:

LIMIT #{ paramMap.offset }, #{ paramMap.pageSize };

해결

수정한 java 코드:

List<ExchangeListVO> exchangeList = exchangeMapper.selectSearchExchangeList(searchFilter, searchWord, startDate, endDate, offset, pageSize);

수정된 Mybatis 코드
(맨 아래 LIMIT #{ offset }, #{ pageSize }; 부분)

    <select id="selectSearchExchangeList" resultMap="exchangeListResultMap">
        SELECT
              A.exchange_code
            , C.franchise_name
            , GROUP_CONCAT(E.name SEPARATOR ', ') AS item_name
            , A.reason
            , F.name AS member_name
            , A.created_at
            , G.status
            , A.approved
         FROM tbl_exchange A
              JOIN tbl_order B ON A.order_code = B.order_code
              JOIN tbl_franchise C ON B.franchise_code = C.franchise_code
              JOIN tbl_exchange_item D ON A.exchange_code = D.exchange_code
              JOIN tbl_item E ON D.item_code = E.item_code
              JOIN tbl_member F ON A.member_code = F.member_code
              JOIN tbl_exchange_status_history G ON A.exchange_code = G.exchange_code
              JOIN (
                    SELECT exchange_code, MAX(created_at) AS max_created_at
                    FROM tbl_exchange_status_history
                    GROUP BY exchange_code
                    ) latest_status ON G.exchange_code = latest_status.exchange_code
          AND G.created_at = latest_status.max_created_at
        <choose>
            <when test="searchFilter == 'exchangeCode'">
                WHERE CAST(A.exchange_code AS CHAR) LIKE CONCAT('%', #{ searchWord }, '%')
            </when>
            <when test="searchFilter == 'franchiseName'">
                WHERE C.franchise_name LIKE CONCAT('%', #{ searchWord }, '%')
            </when>
            <when test="searchFilter == 'managerName'">
                WHERE F.name LIKE CONCAT('%', #{ searchWord }, '%')
            </when>
        </choose>
        <if test="startDate != null and endDate != null">
            AND A.created_at BETWEEN #{ startDate } AND #{ endDate }
        </if>
        GROUP BY A.exchange_code, C.franchise_name, A.reason, F.name, A.created_at, G.status, A.approved
        LIMIT #{ offset }, #{ pageSize };
    </select>

0개의 댓글