2010-04-26 51 views
0

我是新来的iBatis,我正在努力与元素。使用<isNull> ibatis问题,同时迭代列表

我想迭代一个Book实例列表(例如)作为一个HashMap:MyParameters传入。该列表将被称为listOfBooks。

整体SQL语句的条款,因此看起来就像这样:

<iterate prepend="AND" property="MyParameters.listOfBooks" conjunction="AND" open="(" close=")"> 
... 
</iterate> 

我还需要取决于迭代元素中产生不同的SQL是否每个Book实例在“listOfBooks”列表属性为空或者不是。

所以,我需要一个说法是这样的:

<iterate prepend="AND" property="MyParameters.listOfBooks" conjunction="AND" open="(" close=")"> 
     <isNull property="MyParameter.listOfBooks.title"> 
<!-- SQL clause #1 here --> 

     </isNull> 
    <isNotNull property="MyParameter.listOfBooks.title"> 
<!-- SQL clause #2 here --> 
</isNotNull> 

当我这样做,我得到一个错误消息,指出没有“可读的”财产在我的书命名为“标题”类。但是,每个Book实例包含一个标题属性,所以我很困惑!我只能说,我已经在试图查明listOfBooks中特定Book实例的标题时使用了语法。 我正在努力寻找实现这一目标的正确方法。如果任何人都可以提出建议,我会很感激。

感谢

回答

0

我想

property="MyParameter.listOfBooks.title" 

指示ibatis的在MyParameter.listOfBooks对象,这实际上是一个列表来查找一个title属性。你不想这样做,你想在列表的每个元素('光标',说)中查找该属性。

在ibatis的,在<iterate>标签中,语法MyParameter.listOfBooks[]用于引用该元素,而不是完整列表(ref),我不知道这是否是标记属性里面工作,你可以尝试:要么

<isNull property="MyParameter.listOfBooks[].title"> 

甚或

<isNull property="title"> 

BTW,我不知道你正在使用的数据库,但你知道COALESCE功能?

+0

感谢您的参考:我一定会检查出来的。我试过括号内的语法,因为我感觉自己的语法是错误的实体。不幸的是,这也没有奏效。底层数据库是Oracle 10g,但我不知道COALESCE功能。我会研究这个;再次感谢 – onoma 2010-04-26 17:44:28