Thanks, it worked now, with the implicit maps. -----Original Message----- From: Michael He [mailto:[EMAIL PROTECTED] Sent: Wednesday, December 10, 2008 9:54 AM To: [email protected] Subject: Re: Trying to use HashMap as a param object for an UPDATE - getting an exception
When using parameter maps, you must specify question marks(?) in the SQL instead of property names. Recommand to pass in a map and use inline syntax instead Alex Savitsky-2 wrote: > > Hi, > > I'm trying to execute an update, with a HashMap for parameter (there's > no business object to pass). The mapping file is as follows (iBATIS > v.2.3.0.677) > > <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC > "-//ibatis.apache.org//DTD SQL Map 2.0//EN" > "http://ibatis.apache.org/dtd/sql-map-2.dtd"> > <sqlMap namespace="Sector"> > <resultMap class="java.util.HashMap" id="sector"> > <result property="id" column="SECTOR_ID" javaType="java.lang.Integer" /> > <result property="code" column="SECTOR_CD" /> > <result property="description" column="SECTOR_DESC" /> > <result property="fiscalYear" column="FISCAL_YR" > javaType="java.lang.Integer" /> > </resultMap> > <parameterMap class="java.util.HashMap" id="sector"> > <parameter property="id" jdbcType="NUMERIC" /> > <parameter property="code" jdbcType="VARCHAR" /> > <parameter property="description" jdbcType="VARCHAR" /> > <parameter property="fiscalYear" jdbcType="NUMERIC" /> > </parameterMap> <select id="getSectorList" resultMap="sector" > parameterMap="sector"> > SELECT * FROM SECTOR WHERE FISCAL_YR = #fiscalYear# > <isNotEmpty property="code">AND SECTOR_CD LIKE #code#||'%'</isNotEmpty> > <isNotEmpty property="description">AND SECTOR_DESC LIKE > #description#||'%'</isNotEmpty> </select> <update id="updateSector" > parameterMap="sector"> > UPDATE SECTOR SET SECTOR_DESC = #description# WHERE SECTOR_ID = #id# > </update> </sqlMap> > > Both parameters and results are Maps, and the select works when I pass > it a parameter map, whether it has all the properties, or not. Update, > however, fails: > > Map s1 = new HashMap(); > s1.put("code", "001"); > s1.put("description", "Region Transaction upd"); s1.put("fiscalYear", > "2005"); s1.put("id", "1501"); client.update("updateSector", s1); > > com.ibatis.common.jdbc.exception.NestedSQLException: > --- The error occurred in ca/cihi/cmdb/model/Sector.xml. > --- The error occurred while applying a parameter map. > --- Check the Sector.sector. > --- Check the parameter mapping for the 'id' property. > --- Cause: java.sql.SQLException: Invalid column index > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:91) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:505) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:67) > at > ca.cihi.cmdb.service.MaintenanceService.update(MaintenanceService.java:52) > ... 29 more > Caused by: java.sql.SQLException: Invalid column index > at > oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125) > at > oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162) > at > oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227) > at > oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:4754) > at > oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:4717) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at > com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:70) > at $Proxy2.setString(Unknown Source) > at > com.ibatis.sqlmap.engine.type.StringTypeHandler.setParameter(StringTypeHandler.java:30) > at > com.ibatis.sqlmap.engine.type.UnknownTypeHandler.setParameter(UnknownTypeHandler.java:69) > at > com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameter(BasicParameterMap.java:165) > at > com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameters(BasicParameterMap.java:125) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:79) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteUpdate(GeneralStatement.java:200) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:78) > ... 33 more > > Am I doing something wrong? > > Thanks, > > Alex > -- View this message in context: http://www.nabble.com/Trying-to-use-HashMap-as-a-param-object-for-an-UPDATE---getting-an-exception-tp20922966p20936872.html Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
