Ofbiz项目学习——阶段性小结——查询
一、组装参数的学习
首先是查询条件,对于查询条件,需要判断是否从前端传递空值?——怎么处理查询空值?
当然可以一个一个进行判断,但是这样代码会导致很多,可以统一处理,形成一个公共方法。
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项目学习——阶段性小结——查询的更多相关文章
- Ofbiz项目学习——阶段性小结——视图
一.简要介绍 1.按照SQL的视图概念:在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表.视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 2. ...
- Ofbiz项目学习——阶段性小结——删除数据
一.根据主键进行删除 /** * 按主键进行删除 * @param dctx * @param context * @return */ public static Map<String,Obj ...
- Ofbiz项目学习——阶段性小结——更新数据
一.根据一个字段进行修改 /** * 根据一个字段进行修改(这个条件字段可以是主键, 也可以不是主键) * @param dctx * @param context * @return */ publ ...
- Ofbiz项目学习——阶段性小结——插入数据
一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...
- Ofbiz项目学习——阶段性小结——服务返回结果
一.返回成功 1.在.DispatcherReturnDemoService类中编写服务[returnSuccess],内容如下: /** * 返回成功结果 * @param dctx * @para ...
- 转:从开源项目学习 C 语言基本的编码规则
从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...
- 学习SQL关联查询
通过一个小问题来学习SQL关联查询 原话题: 是关于一个left join的,没有技术难度,但不想清楚不一定能回答出正确答案来: TabA表有三个字段Id,Col1,Col2 且里面有一条数据1,1, ...
- openresty 学习笔记小结:综合应用实例
openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...
- Halo 开源项目学习(七):缓存机制
基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...
随机推荐
- Postman接口测试【3】_自动添加随笔
一.抓取博客园编写博客地址 1.通过Charles抓取,获取到编写博客接口地址和接口的参数 二.Postman请求接口 打开Postman,输入上面抓到的接口地址,接口类型为POST,请求参数为x-w ...
- js实现对上传图片的路径转成base64编码,并且对图片进行压缩,实现预览功能1
参考 https://blog.csdn.net/qq_31965515/article/details/82975381 https://www.cnblogs.com/zhangdiIT/p/78 ...
- Visual Studio 重命名项目名
1. 打开VS Studio,重命名项目 2. 重命名对应的项目文件夹,并重命名项目文件夹下的这两个文件名: 3. 用记事本打开解决方案,修改对应的项目名字和路径 未完 ...... 点击访问原文(进 ...
- Java学习:可变参数
可变参数 可变参数:是JDK1.5 之后出现的新特性 使用前提: 当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数. 使用格式:定义方法时使用 修饰符 返回值类型 方法名(数 ...
- java异常的嵌套和级联
一.分开捕获或者嵌套使用 我们先看看下面这段代码: public class Cal { public int div(int a, int b) { int result = a / b; retu ...
- Linux学习笔记之秋水BBR一键部署
0x00 本脚本适用环境 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+内存要求:≥128M 阅读文章时请除手动删出干扰字符“1”.(Shadowsocks) 0x01 关于本 ...
- 浅谈 G1 GC 日志格式
在 Java9 中,G1 GC 将成为默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间). 由于 G1 GC 正在逐渐成为 ...
- 一款比较强大的jquery表格插件Datatables
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 链接:http://www.datatables.club/ 本人无聊时发现的一款用 ...
- 【转】Apache的架构师们遵循的30条设计原则
本文作者叫Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员. 他是Apache Axis2项目的联合创始人,也是Apache Software基金会的成员. 他是WSO2流 ...
- “分而治之”,一种AI和动画系统的架构
译者注:随着国内游戏研发水平的不断提高,对画面品质的不断提升,同时大量手游使用Unity和Unreal 4等成熟的工具开发,动作状态机已经不是什么陌生的概念了.我们在项目开发时也大量使用了动作状态机. ...