[ http://issues.apache.org/jira/browse/IBATIS-51?page=comments#action_58749 ] Dimiter Kapitanov commented on IBATIS-51: -----------------------------------------
Hello Clinton. Thank you for your reply. I understand what you meen, but let me explain the other point of view. We have a project with HUGE domain model. We use Map as replacement of all java-beans (yes I am serious). iBatis is perfect for this, because it doesn't force us to use 'classic-only' things. Imagine this 3 possible cases : 1) parameterClass : Map[key1=value1] iBatis : insert/update field 'key1' to new value. 2) parameterClass : Map[key1=null] iBatis : clear the value of 'key1'. 3) parameterClass : Map[key2=value2] (no property 'key1') iBatis : keep 'key1' as is, but update 'key2'. If <isPropertyAvailable> works differently for Maps and JavaBeans properties, we cannot distinguish case 2) and 3). Even <isNotNull> cannot help us in this case. Please, consider again 'isPropertyAvailable' behaviour - for all these who use Maps. All the best, Dimiter > Nulls interpretted incorrectly in version 2.0.9 > ----------------------------------------------- > > Key: IBATIS-51 > URL: http://issues.apache.org/jira/browse/IBATIS-51 > Project: iBatis for Java > Type: Bug > Components: SQL Maps > Versions: 2.0.9 > Environment: MySQL 3.23.x > Reporter: Dimiter Kapitanov > > When use HashMap as parameter class, SQL query is consturcted (with nulls) > even for missing properties. > This is new bug, appeared in iBatis DBL 2.0.9 (it didn't exist in iBatis DBL > 2.0.7). > Demonstration code : > ------------------------- > [M.java] > import com.ibatis.sqlmap.client.SqlMapClient; > import com.ibatis.sqlmap.client.SqlMapClientBuilder; > import java.io.*; > import java.util.*; > /** > * Test for bug in iBatis DBL 2.0.9. > */ > public class M > { > public static void main(String[] args) > { > System.out.println("Testing iBatis DBL 2.0.9 bug : "); > System.out.println("If you run this program with iBatis 2.0.7 it " + > "will return result, if you run it with iBatis 2.0.9 it will " + > "return null."); > > try > { > String mapFile = "DB_Config.xml"; > Reader reader = new FileReader(mapFile); > SqlMapClient mapper = SqlMapClientBuilder.buildSqlMapClient( > reader); > > HashMap m = new HashMap(); > m.put("name", "Am"); > Map result = (Map)mapper.queryForObject("selectAccount", m); > > System.out.println("Result = " + result); > } > catch (Exception exc) > { > exc.printStackTrace(); > } > } > } > ------------------------- > [DB_Config.xml] > <?xml version="1.0" encoding="UTF-8" standalone="no"?> > <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> > <sqlMapConfig> > <properties resource="debug.ini"/> > <transactionManager type="JDBC"> > <dataSource type="SIMPLE"> > <property value="${DB_DRIVER}" name="JDBC.Driver"/> > <property value="${DB_URL}" name="JDBC.ConnectionURL"/> > <property value="${DB_USER}" name="JDBC.Username"/> > <property value="${DB_PASSWORD}" name="JDBC.Password"/> > <property value="${DB_QUERY}" name="Pool.PingQuery"/> > <property value="15" name="Pool.MaximumActiveConnections"/> > <property value="15" name="Pool.MaximumIdleConnections"/> > <property value="1000" name="Pool.MaximumWait"/> > </dataSource> > </transactionManager> > <sqlMap resource="Account.xml"/> > > </sqlMapConfig> > ------------------------- > [Account.xml] > <?xml version="1.0" encoding="UTF-8" standalone="no"?> > <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-2.dtd"> > <sqlMap> > <statement id="selectAccount" parameterClass="java.util.HashMap" > resultClass="java.util.HashMap"> > SELECT * FROM table1 > <dynamic prepend="WHERE"> > <isPropertyAvailable prepend="AND" property="id"> > id = #id# > </isPropertyAvailable> > <isPropertyAvailable prepend="AND" property="name"> > name = #name# > </isPropertyAvailable> > </dynamic> > ORDER BY name > </statement> > </sqlMap> > --------------------- > [debug.sql] > # > # testDB SQL script (uses MySQL 3.23.x). > # > CREATE DATABASE testDB; > GRANT ALL PRIVILEGES ON testDB.* TO 'testDB'@'localhost' IDENTIFIED BY > 'testDB'; > FLUSH PRIVILEGES; > use testDB; > CREATE TABLE table1 ( > id int unsigned NOT NULL auto_increment primary key, > name varchar(20) > ); > insert into table1 values (1, 'Am'); > insert into table1 values (2, 'Tam'); > --------------------- > [debug.ini] > # > # testDB settings. > # > DB_DRIVER=com.mysql.jdbc.Driver > DB_URL=jdbc:mysql://localhost/testDB?useUnicode=true > DB_USER=testDB > DB_PASSWORD=testDB > DB_QUERY=select 1 from table1 -- 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 - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira
