一、方法代码
/**
* Parses input parameters and returns an <code>EntityCondition</code> list.
*
* @param parameters
* @param fieldList
* @param queryStringMap
* @param delegator
* @param context
* @return returns an EntityCondition list
*
* @author jack
* 第一步:获取所有字段信息 存入到Map<String, ModelField> fieldMap
* 第二步:将上下文这个map进行遍历,这个map是传进来的参数
* 由于是根据参数,一个字段最多具有三个条件 _op _fld0_op _fld1_op
* 第三步: 调用createSingleCondition创造条件,添加到集合
*
* @param parameters 获取传入的参数
* @param fieldList 传入当前实体所有字段
* @param queryStringMap
* @param delegator 操作数据库的实例
* @param context 获取上下文
*/
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;
/**
* 将参数名截断对应实体中的字段名,这样做的方式是先获取字段名
* (如果包含fld0 fld1下面则需要再截断),
* 下面进行连接,针对几种不同的情况进行处理
*/
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);
}
//_ic连接 是判断条件查找是否忽略大小写
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);
}
//获取字段的值,如果具有_fld0 这些可能获取不到,后面会进一步截断获取
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;
}
//将创建的条件加入list集合 即AND关系
result.add(createSingleCondition(modelField, operation, fieldValue, ignoreCase, delegator, context));
for (String mapKey : keys) {
queryStringMap.put(mapKey, parameters.get(mapKey));
}
}
return result;
}
二、方法使用
<select name="visitId_op" class="selectBox">
<option value="equals">等于</option>
<option value="like">开头字符</option>
<option value="contains" selected="selected">包含</option>
<option value="empty">为空</option>
<option value="notEqual">不等于</option>
</select>
三、了解方向
条件查找主要是将实体字段都找到,对参数循环匹配,查看FindServices这个类,以及一些业务就能有较清晰的认识