ofbiz方法一 条件查询createConditionList

一、方法代码

 /**
     * 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这个类,以及一些业务就能有较清晰的认识

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

mybatis 对于基本类型数据传值的问题

最近在开发的时候,遇到一个小问题: Caused by: org.apache.ibatis.reflection.ReflectionException: T...

4616
来自专栏Java帮帮-微信公众号-技术文章全总结

Java读写Properties属性文件公用方法

Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配...

892
来自专栏小勇DW3

java设计模式之模板模式以及钩子方法使用

  模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台。当不可变和可变的方法在子类中混合在一起的时候,

1064
来自专栏青枫的专栏

java基础加强之内省

742
来自专栏Java后端生活

JavaWeb(十一)JavaBean

1696
来自专栏java系列博客

深入理解Java内存模型(六)——final

1263
来自专栏Java后端技术

Java反射实战

  最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后...

924
来自专栏WD学习记录

8-14 Android学习ing

1.异常java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

652
来自专栏大闲人柴毛毛

跟着柴毛毛学Spring(2)——Bean的配置

Java中创建一个对象分两步: 1.通过关键字new创建一个对象 2.通过构造函数或setter函数为对象添加初始化参数 当Spring出现后,对象...

3315
来自专栏osc同步分享

springmvc 其他

<!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-contr...

3378

扫码关注云+社区