一、组装参数的学习

首先是查询条件,对于查询条件,需要判断是否从前端传递空值?——怎么处理查询空值?

当然可以一个一个进行判断,但是这样代码会导致很多,可以统一处理,形成一个公共方法。

1、 单个处理的方式:

  调用工具方法判空(底层:判断是否是null 和空)


/** UtilValidate类. */

/** Check whether string s is NOT empty. */
public static boolean isNotEmpty(String s) {
return (s != null) && s.length() > 0;
}


/** Check whether collection c is NOT empty. */
public static <E> boolean isNotEmpty(Collection<E> c) {
return (c != null) && !c.isEmpty();
}


/** Check whether charsequence c is NOT empty. */
public static <E> boolean isNotEmpty(CharSequence c) {
return ((c != null) && (c.length() > 0));
}

 
        if (UtilValidate.isNotEmpty(startDate)) {
condList.add(EntityCondition.makeCondition(PackagePrepayFields.REPAY_APP_DATE,
EntityOperator.GREATER_THAN_EQUAL_TO,
startDate));
}

2、多个处理:

  多个处理需要知道最终需要的是什么数据结构。反向推导

    /** Set a list of EntityCondition objects to be ANDed together as the WHERE clause for the query
*
* NOTE: Each successive call to any of the where(...) methods will replace the currently set condition for the query.
* @param fieldMap - A list of EntityCondition objects to be ANDed together as the WHERE clause for the query
* @return this EntityQuery object, to enable chaining
*/
public <T extends EntityCondition> EntityQuery where(List<T> andConditions) {
this.whereEntityCondition = EntityCondition.makeCondition(andConditions);
return this;
}

从上面的API中,可以看到需要的是List<T>,T必须是EntityCondition的子类或者其本身,暂时先使用EntityCondition,所以返回是List<EntityCondition>。

    /**
* 封装查询条件列表
*
* @param arr
* @param context 入参上下文
* @author
*/
public static List<EntityCondition> setConditions(String[] arr, Map<String, ? extends Object> context) {
if (arr == null || arr.length <= 0) {
return null;
}
List<EntityCondition> conditionList = new LinkedList<EntityCondition>();
for (int i = 0; i < arr.length; i++) {
if (context.get(arr[i]) != null && !context.get(arr[i]).equals("")) {
conditionList.add(EntityCondition.makeCondition(arr[i], context.get(arr[i])));
}
}
return conditionList;
}

上述方法中EntityCondition.makeCondition(arr[i],context.get(arr[i]))调用的API如下:

public static <R> EntityExpr makeCondition(String fieldName, R value) {
return new EntityExpr(fieldName, EntityOperator.EQUALS, value);
}

但是针对非EntityOperator.EQUALS的查询条件,需要自己写。

    public static <L,R,LL,RR> EntityExpr makeCondition(L lhs, EntityComparisonOperator<LL,RR> operator, R rhs) {
return new EntityExpr(lhs, operator, rhs);
}

3、分页处理

        Integer viewIndex = ToolsUtil.paraseObjToInteger(context.get(PackagePrepayFields.VIEW_INDEX), 1);
Integer viewSize = ToolsUtil.paraseObjToInteger(context.get(PackagePrepayFields.VIEW_SIZE), 20);
    /**
* 将Object对象转换为Integer
*
* @param obj
* @param def
* @return
* @author
*/
public static Integer paraseObjToInteger(Object obj, Integer def) {
if (obj == null || "null".equals(obj)) {
return def;
}
try {
return Integer.parseInt(obj.toString());
} catch (Exception e) {
throw new RuntimeException("Object{" + obj.toString() + "} parase to Decimal exception!", e);
}
}

再次,是查询要展示的列,查看API,提供两种方式

    /** Set the fields to be returned when the query is executed.
*
* Note that the select methods are not additive, if a subsequent
* call is made to select then the existing fields for selection
* will be replaced.
* @param fieldsToSelect - A Set of Strings containing the field names to be selected
* @return this EntityQuery object, to enable chaining
*/
public EntityQuery select(Set<String> fieldsToSelect) {
this.fieldsToSelect = fieldsToSelect;
return this;
} /** Set the fields to be returned when the query is executed.
*
* Note that the select methods are not additive, if a subsequent
* call is made to select then the existing fields for selection
* will be replaced.
* @param fieldsToSelect - Strings containing the field names to be selected
* @return this EntityQuery object, to enable chaining
*/
public EntityQuery select(String...fields) {
this.fieldsToSelect = UtilMisc.toSetArray(fields);
return this;
}

鉴于此代码,包装的更多,使用更简单,public EntityQuery select(String...fields)

String[] columns =
{PackagePrepayFields.CUST_NO, PackagePrepayFields.CUST_NAME, PackagePrepayFields.VEHICLE_NO,
PackagePrepayFields.PLATE_NO, PackagePrepayFields.DOC_NO, PackagePrepayFields.SALE_NAME,
PackagePrepayFields.PENTY_AMT, PackagePrepayFields.PENTY_DEDUCT, PackagePrepayFields.PRIN_AMT,
PackagePrepayFields.AHEAD_AMT, PackagePrepayFields.PAY_MODE, PackagePrepayFields.MAIL_ADDRESS,
PackagePrepayFields.REPAY_APP_DATE, PackagePrepayFields.REPAY_APP_STATUS,
PackagePrepayFields.OPER_NO, PackagePrepayFields.RET_MSG, PackagePrepayFields.REMARK};

当然,我们如果开发过程中,需要再多个地方使用,这块可以提取出来,作为公共方法。

最后我们看一下查询的方法

PagedList<GenericValue> pagedList = EntityQuery.use(delegator)
.select(columns)
.from(PackagePrepayFields.COM_MESSAGE_INFO_TEXT_THREE)
.where(condList)
.cursorScrollInsensitive()
.queryPagedList(viewIndex - 1, viewSize);
result.put("list", pagedList.getData());
result.put("totalSize", pagedList.getSize());

比较一下不分页的

// 不带分页
List<GenericValue> list =EntityQuery.use(delegator)
.select(columns)
.from(PackagePrepayFields.COM_MESSAGE_INFO_TEXT_THREE)
.where(condList)
.queryList();

顺便看一下服务(方法名称)对应XML的配置

  入参

<attribute name="viewSize" type="Integer" mode="IN"  optional="true" description="条数" />
<attribute name="viewIndex" type="Integer" mode="IN" optional="true" description="页码" />

  出参

<attribute name="returnCode" type="Map" mode="OUT" optional="true" description="标准返回状态数据"/>
<attribute name="totalSize" type="Integer" mode="OUT" optional="true" description="返回总条数" /> <--此处注意出参的大小写 -->

Ofbiz项目学习——阶段性小结——查询的更多相关文章

  1. Ofbiz项目学习——阶段性小结——视图

    一.简要介绍 1.按照SQL的视图概念:在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表.视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 2. ...

  2. Ofbiz项目学习——阶段性小结——删除数据

    一.根据主键进行删除 /** * 按主键进行删除 * @param dctx * @param context * @return */ public static Map<String,Obj ...

  3. Ofbiz项目学习——阶段性小结——更新数据

    一.根据一个字段进行修改 /** * 根据一个字段进行修改(这个条件字段可以是主键, 也可以不是主键) * @param dctx * @param context * @return */ publ ...

  4. Ofbiz项目学习——阶段性小结——插入数据

    一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...

  5. Ofbiz项目学习——阶段性小结——服务返回结果

    一.返回成功 1.在.DispatcherReturnDemoService类中编写服务[returnSuccess],内容如下: /** * 返回成功结果 * @param dctx * @para ...

  6. 转:从开源项目学习 C 语言基本的编码规则

    从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...

  7. 学习SQL关联查询

    通过一个小问题来学习SQL关联查询 原话题: 是关于一个left join的,没有技术难度,但不想清楚不一定能回答出正确答案来: TabA表有三个字段Id,Col1,Col2 且里面有一条数据1,1, ...

  8. openresty 学习笔记小结:综合应用实例

    openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...

  9. Halo 开源项目学习(七):缓存机制

    基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...

随机推荐

  1. Flutter 宽高比(比率)控件 AspectRatio

    const AspectRatio({ Key key, @required this.aspectRatio, Widget child,}) void main() {  runApp(    n ...

  2. ubuntu docker 下mongodb集群和分片

    首先我们计划启动了三个mongo服务:master,salve,arbiter 1.准备工作 新建文件夹如图(每个文件夹下面有db和configdb文件夹): 生成认证文件并修改权限 openssl ...

  3. Django 模板语言 for循环

    Django 模板语言 for 循环 ******  for 循环字典 ********** USER_DICT = { 'k1':'root1', 'k2':'root2', 'k3':'root3 ...

  4. Nginx入门教程(转)

    原文:https://www.cnblogs.com/qdhxhz/p/8910174.html nginx入门教程 一.概述    什么是nginx?   Nginx (engine x) 是一款轻 ...

  5. mosquitto: error while loading shared libraries: libwebsockets.so.12: cannot open shared object file

    错误描述: # mosquitto -c /etc/mosquitto/mosquitto.conf -dmosquitto: error while loading shared libraries ...

  6. - XML 解析 总结 DOM SAX PULL MD

    目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...

  7. CentOS8 安装MySQL8.0

    2019/11/25, CentOS 8,MySQL 8.0 摘要: CentOS 8 安装MySQL 8.0 并配置远程登录 安装MySQL8.0 使用最新的包管理器安装MySQL sudo dnf ...

  8. 1-python运算符和逻辑控制语句

    目录 运算符 条件语句if…else 断言assert 循环语句while 遍历for循环 1.运算符 1.1.算数运算符 加+.减-.乘*.除/.余%.次方**.向下取整除// 1.2.赋值运算符 ...

  9. RabbitMQ的简单模式快速入门与超时异常的处理方法

    本文适合JAVA新人,想了解RabbitMQ又不想去看官网文档的人(英语水看的头疼(◎﹏◎),但建议有能力还是去看官网文档). 消息队列MQ(一) MQ全称为Message Queue,消息队列是应用 ...

  10. mmap vs read

    先放个结论: 内存映射通常比随机访问更快,尤其访问的对象是分离的和不可预测的. 内存映射会持续占用pages, 直到完成访问. 这意味当长时间重度使用一个文件很久之前, 然后你关闭了它, 然后再重新打 ...