ofbiz总结——使用performFind查询时如何设置查询条件值为null的情况

来源:互联网 发布:程序员刚入职很闲 编辑:程序博客网 时间:2024/06/06 02:51

在使用performFind查找时,希望有个查询条件默认为null。比如:

<set field="requestParameters.result" value="null"/>
当然上面的配置是无法达到目的的,只会导致查询出满足result='null'的记录。

通过分析performFind服务的源码,得出解决方案:

<set field="requestParameters.result_op" value="empty"/>
这样配置后就会在查询是加上条件 result is null

具体分析步骤:

1. 找到performFind服务的实现源码。源码位置在framework\common\src\main\java\org\apache\ofbiz\common\FindServices.java文件中。

2. 具体调用流程   performFind方法 ——》prepareFind方法 ——》createConditionList方法。关键地方就在createConditionList方法。

public static List<EntityCondition> createConditionList(Map<String, ? extends Object> parameters, List<ModelField> fieldList, Map<String, Object> queryStringMap, Delegator delegator, Map<String, ?> context) {        Set<String> processed = new LinkedHashSet<String>();        Set<String> keys = new LinkedHashSet<String>();        Map<String, ModelField> fieldMap = new LinkedHashMap<String, ModelField>();        for (ModelField modelField : fieldList) {            fieldMap.put(modelField.getName(), modelField);        }        List<EntityCondition> result = new LinkedList<EntityCondition>();        for (Map.Entry<String, ? extends Object> entry : parameters.entrySet()) {            String parameterName = entry.getKey();            if (processed.contains(parameterName)) {                continue;            }            keys.clear();            String fieldName = parameterName;            Object fieldValue = null;            String operation = null;            boolean ignoreCase = false;            if (parameterName.endsWith("_ic") || parameterName.endsWith("_op")) {                fieldName = parameterName.substring(0, parameterName.length() - 3);            } else if (parameterName.endsWith("_value")) {                fieldName = parameterName.substring(0, parameterName.length() - 6);            }            String key = fieldName.concat("_ic");            if (parameters.containsKey(key)) {                keys.add(key);                ignoreCase = "Y".equals(parameters.get(key));            }            key = fieldName.concat("_op");            if (parameters.containsKey(key)) {                keys.add(key);                operation = (String) parameters.get(key);            }            key = fieldName.concat("_value");            if (parameters.containsKey(key)) {                keys.add(key);                fieldValue = parameters.get(key);            }            if (fieldName.endsWith("_fld0") || fieldName.endsWith("_fld1")) {                if (parameters.containsKey(fieldName)) {                    keys.add(fieldName);                }                fieldName = fieldName.substring(0, fieldName.length() - 5);            }            if (parameters.containsKey(fieldName)) {                keys.add(fieldName);            }            processed.addAll(keys);            ModelField modelField = fieldMap.get(fieldName);            if (modelField == null) {                continue;            }            if (fieldValue == null) {                fieldValue = parameters.get(fieldName);            }            if (ObjectType.isEmpty(fieldValue) && !"empty".equals(operation)) {                continue;            }            result.add(createSingleCondition(modelField, operation, fieldValue, ignoreCase, delegator, context));            for (String mapKey : keys) {                queryStringMap.put(mapKey, parameters.get(mapKey));            }        }        return result;    }

3. 分析上面的代码,必须满足下面条件才能把条件为null的加入进去。

if (ObjectType.isEmpty(fieldValue) && !"empty".equals(operation)) {                continue;            }
所以最终分析得出解决方案,只需要配置“_op“后缀值为empty就可以了。

<set field="requestParameters.result_op" value="empty"/>






阅读全文
0 0
原创粉丝点击