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>