ibatis-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Philippe Laflamme <philippe.lafla...@mail.mcgill.ca>
Subject Re: [jira] Commented: (IBATIS-51) Nulls interpretted incorrectly in version 2.0.9
Date Mon, 07 Feb 2005 16:54:50 GMT

I wonder what the use of the <isPropertyAvailable> can be if it's not 
applied to a Map (before 2.0.8). You cannot change a statement's 
parameter map dynamically (one statement, one parameter map/class), so 
the properties that are available when building the statement cannot 
change. If I'm not mistaken, the answer to isPropertyAvailable is 
_always_ the same (true or false), no matter how you're calling a 
statement. I'm probably overlooking something...

We use the isPropertyAvailable tag in certain rare situations, but only 
when dealing with paramater classes that are Maps. How is the tag useful 
when dealing with a bean?

Thanks,
Philippe


Clinton Begin (JIRA) wrote:
>      [ http://issues.apache.org/jira/browse/IBATIS-51?page=comments#action_58679 ]
>      
> Clinton Begin commented on IBATIS-51:
> -------------------------------------
> 
> Thanks for figuring this one out Dimiter.
> 
> This was a concious decision made by us.  Previously a bug was entered that made sense...as
you can see I've always been uncomfortable with the subject, as I even left the old code there.

> 
> So, here's a perfect example of why Maps suck for domain models (not a criticism, just
a point).  When exactly does a Map "have" a property?  There are two possibilities:
> 
> 1) A Map has properties based on whether it "containsKey" for the given property name.
>     - Caveat:  In some cases you'll find yourself having to set keys in the Map before
they'll work with a given statement as a parameter or predefined result.  Perhaps this is
better, simply because it is more explicit.
> 
> -OR-
> 
> 2) Because a Map is so loosely described, a Map can be said to have ANY property --all
the time, no matter what keys are currently on it. 
>     - Caveat: <isPropertyAvailable>  will always return true.
> 
> So before I swing the pendulum back towards option #1, I wonder if you guys can possibly
use <isNotNull> instead of <isPresent>?
> 
> PS:  It's not so much that we're busy, but in fact our source tree has been locked for
two weeks in transition to ASF infrastructure....sad but true.
> 
> Cheers,
> Clinton
> 
> 
>>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
> 
> 


Mime
View raw message