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 条评论
登录 后参与评论

相关文章

来自专栏海天一树

小朋友学C++(14):两数交换

之前学C语言的时候,咱们直接在main函数中使用“异或”位运算符,很容易实现了两数交换。 本节课将在此基础上,把交换两个数的算法,封装到swap函数中。这样不管...

2827
来自专栏海说

单元测试基本方法

依照类型划分,单元测试方法可以划分为两大类。一类是针对public方法进行测试,另一类是针对private方法进行测试。 public方法测试 public方法...

2100
来自专栏冰霜之地

iOS如何优雅的处理“回调地狱Callback hell”(二)——使用Swift

在上篇中,我谈到了可以用promise来解决Callback hell的问题,这篇我们换一种方式一样可以解决这个问题。

1622
来自专栏码匠的流水账

聊聊flink的MemoryBackendCheckpointStorage

本文主要研究一下flink的MemoryBackendCheckpointStorage

742
来自专栏你不就像风一样

Jsoup+FastJson制作新闻数据接口-Demo

经常用到 编写出来直接拿来用 这个适合在服务端结合servlet来做接口:需要下载jsoup+fastjson两个包 Jsoup使用手册:http:/...

882
来自专栏跟着阿笨一起玩NET

对Jquery+JSON+WebService的一点认识

Jquery作为一款优秀的JS框架,简单易用的特性就不必说了。在实际的开发过程中,使用JQ的AJAX函数调用WebService

1452
来自专栏后端之路

Dubbo客户端返回自定义异常

虽然上一篇解决了message过长的问题 Dubbo自定义异常message过长解决 但是小伙伴仍然反映对于异常不能使用原类型而导致邮件报错太多(邮件报错基于错...

48910
来自专栏函数式编程语言及工具

Scalaz(47)- scalaz-stream: 深入了解-Source

   scalaz-stream库的主要设计目标是实现函数式的I/O编程(functional I/O)。这样用户就能使用功能单一的基础I/O函数组合成为功能完...

2765
来自专栏javathings

SpringBoot 中异常处理

SpringBoot 中异常处理非常简单,通过@ControllerAdvice 和@ExceptionHandler 注解,可以实现自定义的统一异常处理模块。

3194
来自专栏pangguoming

Proguard使用最新,最全教程,亲自试验

最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而...

3533

扫码关注云+社区