我在尝试使用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>
我们在这里使用的2个java类:
public class SearchProfile {
private Map<String, SearchProfileCriteria> filterCriteria;
public SAOSearchProfile() {
filterCriteria = new HashMap<>();
}
public Map<String, SAOSearchProfileCriteria> getFilterCriteria() {
return filterCriteria;
}
public void setFilterCriteria(Map<String, SAOSearchProfileCriteriaBase> filterCriteria) {
this.filterCriteria = filterCriteria;
}
}
上面是传递给iBatis进行查询的容器对象,下面是将成为地图值的条件对象。在此示例中,它使用字符串"account"
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:
getSQLString()
方法是我在解决方案中的半尝试,String在查询中被转义并引发语法错误。
当我删除<isEqual>
块时,查询执行find,这表示在检查它时是否能够读取"account"
键以查看它是否为空。如上所述,我们还可以使用<iterate>
代码中的地图密钥而不会出现问题。似乎<isEqual>
和<isNotEqual>
是导致问题的唯一标记。有没有人有这方面的经验或知道可能会发生什么?
答案 0 :(得分:0)
注意:使用isNotNull
,isEqual
,iterate
iBatis ,它们不再存在于 Mybatis 中因此,无差别地引用Mybatis令人困惑。
对于您的问题,如果用类替换Map(在编译时将知道属性)它的行为如何?
或尝试使用<isPropertyAvailable>
。
解决方法可以使用正确的语法:$
而不是#
:$filterCriteria.account.SQLString$
而不是#filterCriteria.account.SQLString#
,然后将值连接起来而不是绑定为参数。