在使用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"/>