使用时等于时,Ibatis无法从地图中读取属性



当尝试使用isEqual从Java地图读取属性时,我看到了一个非常奇怪的问题,但与其他IBATIS操作员没有。例如,当使用isNotNulliterate时,它可以读取映射属性。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()方法是我在工作中进行的半烘烤尝试,弦在查询中被逃脱并抛出语法错误。

当我删除<isEqual>时,查询执行查找,这表明在检查以查看是否为null时,它可以读取"account"键。如上所述,我们还可以在没有问题的情况下使用<iterate>标签中的地图键。<isEqual><isNotEqual>似乎是引起问题的唯一标签。有人对此有经验或知道可能发生的事情吗?

当心:使用isNotNullisEqualiterate ibatis ,它们不再存在于 mybatis 中,因此请与Mybatis无关紧要令人困惑。

参考文档。

在您的问题上,如果用类替换地图(在编译时都知道属性),它将如何表现?

或尝试使用<isPropertyAvailable>

周围的工作可以使用正确的语法: $而不是 #$filterCriteria.account.SQLString$而不是 #filterCriteria.account.SQLString#,然后该值只是串联而不是绑定为参数。

最新更新