使用isEqual时,iBatis无法从映射中读取属性
当我尝试使用使用isEqual时,iBatis无法从映射中读取属性,ibatis,Ibatis,当我尝试使用isEqual从Java映射中读取属性时,iBatis出现了一个非常奇怪的问题,但其他iBatis操作符却没有。例如,当使用isNotNull和iterate时,它能够很好地读取映射属性。xml: <isNotNull property="filterCriteria.account"> AND id <isEqual property="filterCriteria.account.meetsCriteria
isEqual
从Java映射中读取属性时,iBatis出现了一个非常奇怪的问题,但其他iBatis操作符却没有。例如,当使用isNotNull
和iterate
时,它能够很好地读取映射属性。xml:
<isNotNull property="filterCriteria.account">
AND
id
<isEqual property="filterCriteria.account.meetsCriteria" compareValue="false">
NOT
</isEqual>
IN
(SELECT DISTINCT id
FROM account
WHERE some other criteria....
)
</isNotNull>
例外情况是:
Cause: com.ibatis.common.beans.ProbeException: There is no READABLE property named 'account' in class 'java.util.Map'; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
getSQLString()
方法是我不成熟的变通方法,字符串在查询中被转义并抛出语法错误
当我删除
块时,查询将执行find,这表明它在检查“account”
键是否为null时能够读取该键。正如我上面提到的,我们还可以在
标记中使用映射键而不会出现问题。似乎只有
和
标记会引起问题。有人对此有经验或知道会发生什么吗?注意:使用isNotNull
,isEqual
,iterate
是iBatis,它们在Mybatis中不再存在,因此对Mybatis的引用会让人困惑
对于您的问题,如果将Map替换为类(属性将在编译时已知),它的行为如何
或者尝试使用
解决方法可以使用正确的语法:$
而不是
:$filterCriteria.account.SQLString$
而不是#filterCriteria.account.SQLString
,然后将值连接起来而不是作为参数绑定
public class SearchProfileCriteria {
boolean meetsCriteria;
public String getCriteriaAsString() {
return StringUtils.getStringValueFromBoolean(meetsCriteria);
}
public boolean isMeetsCriteria() {
return meetsCriteria;
}
public void setMeetsCriteria(boolean meetsCriteria) {
this.meetsCriteria = meetsCriteria;
}
public String getSQLString(){
return meetsCriteria ? "" : "NOT";
}
}
Cause: com.ibatis.common.beans.ProbeException: There is no READABLE property named 'account' in class 'java.util.Map'; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: