Bug when resultClass is a map in dynamic statement --------------------------------------------------
Key: IBATIS-354 URL: http://issues.apache.org/jira/browse/IBATIS-354 Project: iBatis for Java Issue Type: Bug Components: SQL Maps Affects Versions: 2.2.0, 2.1.7 Environment: SUN JDK 1.4.2_10 Tomcat 5.0.28 MySQL 5.x Reporter: sam zheng When I want to return a map(HashMap) to temply get a summary result,I catch a bug. I change my ibatis from 2.1.7 to 2.2.0,the bug is still there. I debug it in 2.2.0 with src and found the code seems to reuse the resultMappings though the allowRemapping is false. --------> public ResultMapping[] getResultMappings() { if (allowRemapping) { return (ResultMapping[]) remappableResultMappings.get(); } else { return resultMappings; } } So when I change my dynamic statement from DAY(summaryType=DAY) to MONTH(summaryType=MONTH),the column 'c_day' is not exits now,and then in ObjectTypeHandler class,the getResult method want to invoke rs.getObject(columnName),execption throw. ---------> public Object getResult(ResultSet rs, String columnName) throws SQLException { Object object = rs.getObject(columnName); if (rs.wasNull()) { return null; } else { return object; } } Exception is : -------------------> org.apache.jasper.JasperException: Failed to queryForList - id [summary], parameterObject [{summaryFor=MEMBER, dateFrom=2006-9-06, summaryType=MONTH, dateTo=2006-10-06}]. Cause: com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred in com/tuanzi/persistence/sql/Summary.xml. --- The error occurred while applying a result map. --- Check the summary-AutoResultMap. --- Check the result mapping for the 'c_day' property. --- Cause: java.sql.SQLException: Column 'c_day' not found. Caused by: java.sql.SQLException: Column 'c_day' not found. org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) com.tuanzi.presentation.base.AccessFilter.doFilterInternal(AccessFilter.java:64) com.tuanzi.presentation.base.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:59) com.tuanzi.presentation.base.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:44) com.tuanzi.presentation.base.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:59) My sqlmap config file is : --------------------> <select id="summary" resultClass="java.util.HashMap" parameterClass="java.util.Map"> <dynamic> <isEqual property="summaryType" compareValue="DAY"> SELECT c_year,c_month,c_day, </isEqual> <isEqual property="summaryType" compareValue="MONTH"> SELECT c_year,c_month, </isEqual> <isEqual property="summaryType" compareValue="YEAR"> SELECT c_year, </isEqual> </dynamic> sum(c_member_num) as c_member_num, sum(c_group_num) as c_group_num, sum(c_tip_num) as c_tip_num, sum(c_forwar_num) as c_forwar_num FROM ( SELECT year(c_registertime) as c_year, month(c_registertime) as c_month, day(c_registertime) as c_day, count(*) as c_member_num, 0 as c_group_num, 0 as c_tip_num, 0 as c_forwar_num FROM t_memberinfo GROUP BY c_year,c_month,c_day ) as t <dynamic> <isEqual property="summaryType" compareValue="DAY"> <![CDATA[ WHERE ( c_year>year(#dateFrom#) OR c_year=year(#dateFrom#) AND c_month>month(#dateFrom#) OR c_year=year(#dateFrom#) AND c_month=month(#dateFrom#) AND c_day>=day(#dateFrom#) ) AND ( c_year<year(#dateTo#) OR c_year=year(#dateTo#) AND c_month<month(#dateTo#) OR c_year=year(#dateTo#) AND c_month=month(#dateTo#) AND c_day<=day(#dateTo#) ) GROUP BY c_year,c_month,c_day ORDER BY c_year,c_month,c_day ]]> </isEqual> <isEqual property="summaryType" compareValue="MONTH"> <![CDATA[ WHERE ( c_year>year(#dateFrom#) OR c_year=year(#dateFrom#) AND c_month>=month(#dateFrom#) ) AND ( c_year<year(#dateTo#) OR c_year=year(#dateTo#) AND c_month<=month(#dateTo#) ) GROUP BY c_year,c_month ORDER BY c_year,c_month ]]> </isEqual> <isEqual property="summaryType" compareValue="YEAR"> <![CDATA[ WHERE ( c_year>=year(#dateFrom#) ) AND ( c_year<=year(#dateTo#) ) GROUP BY c_year ORDER BY c_year ]]> </isEqual> </dynamic> </select> -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira