> So, would <isNotNull> work for you instead?

Yep, that's fine for our situation.

> Your point is well taken, but I'd place that issue on the
> <isPropertyAvailable> tag (and it's uselessness), not necessarily on
> the Map introspection support.

Both are related. The uselessness of isPropertyAvailable tag comes from the desicions made for Map introspection. If the "pendulum" swings by option #1, it's still useful (when dealing with Map parameterClasses).

I guess a new issue about the tag could depend on this one (#51). What do you think?

Philippe

Clinton Begin wrote:
The <isPropertyAvailable> tag was intended for loosely defined
parameter classes.  Perhaps it's not very usefull anymore, now that
parameter maps are pretty much concretely tied to the statement.  In
version 1.x, you could pass different parameter types to the
statements that would be dynamically resolved at runtime.  So
isPropertyAvailable could be used in those cases.

Your point is well taken, but I'd place that issue on the
<isPropertyAvailable> tag (and it's uselessness), not necessarily on
the Map introspection support.

So, would <isNotNull> work for you instead?

Cheers,
Clinton


On Mon, 07 Feb 2005 11:54:50 -0500, Philippe Laflamme <[EMAIL PROTECTED]> wrote:

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







Reply via email to