前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ofbiz方法一 条件查询createConditionList

ofbiz方法一 条件查询createConditionList

作者头像
cfs
发布2018-03-08 15:25:39
6780
发布2018-03-08 15:25:39
举报
文章被收录于专栏:编码小白编码小白

一、方法代码

代码语言:javascript
复制
 /**
     * 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;
    }

二、方法使用

代码语言:javascript
复制
<select name="visitId_op" class="selectBox">      
代码语言:javascript
复制
	<option value="equals">等于</option>      
代码语言:javascript
复制
	<option value="like">开头字符</option>      
代码语言:javascript
复制
	<option value="contains" selected="selected">包含</option>      
代码语言:javascript
复制
	<option value="empty">为空</option>      
代码语言:javascript
复制
	<option value="notEqual">不等于</option>    
代码语言:javascript
复制
</select>

三、了解方向

条件查找主要是将实体字段都找到,对参数循环匹配,查看FindServices这个类,以及一些业务就能有较清晰的认识

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档