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

相关文章

来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2645
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4015
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2060
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3859
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5287
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4848
来自专栏落花落雨不落叶

canvas画简单电路图

61011
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5426
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

31610

扫码关注云+社区