一、简要介绍

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

2、SQL CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

3、举例:视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
// 我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
// Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

二 、ofbiz——动态视图——Java代码实现

思路:定义成员实体(表),定义各个实体的别名(表字段别名),成员实体建立字段关系(表之间通过字段建立联系)

DynamicViewEntity dve = new DynamicViewEntity();
// 定义成员实体(表)
dve.addMemberEntity("tableOne", "tableOne");
dve.addMemberEntity("tableTwo", "tableTwo");
dve.addMemberEntity("tableTwo", "tableThree");

定义各个实体的别名(表字段别名)

// 定义表1的字段
dve.addAlias("tableOne", "id");
// tableOne表中的字段全部显示,并且都不设置前缀
dve.addAlias("tableOne", null);
// 定义表2的字段
dve.addAlias("tableTwo", "id");
dve.addAlias("tableTwo", "name"); 
// 定义表3的字段
dve.addAlias("tableThree", "id");
dve.addAlias("tableThree","productId" );
dve.addAlias("tableThree", "sceneId");
dve.addAlias("tableThree", "riskId");

注意:有些字段需要重命名,

dve.addAlias("tableThree", "name", "firstName", null, null, null, null);

上述源码:

最后建立关系:(外连接)

dve.addViewLink(“tableOne”,"tableThree",Boolean.TRUE,
ModelKeyMap.makeKeyMapList("id", "riskId"));

内连接  

dve.addViewLink(“tableTwo”,"tableThree",Boolean.False,
UtilMisc.toList(new ModelKeyMap("id", "productId")));

源码:

    public void addViewLink(String entityAlias, String relEntityAlias, Boolean relOptional, List<ModelKeyMap> modelKeyMaps) {
ModelViewLink modelViewLink = new ModelViewLink(entityAlias, relEntityAlias, relOptional, null, modelKeyMaps);
this.viewLinks.add(modelViewLink);
}

最后:组装要展示的列,执行查询

Set<String> set = new HashSet<>();
set.add("id");
set.add("riskId");
set.add("productId"); List<GenericValue> list = EntityQuery.use(delegator)
.select(set)
.from(dve)
.where(condList)
.cursorScrollInsensitive()
.queryList();

  

全部实现 代码:

/**
* 多表联合查询
* @param dctx
* @param context
* @return
*/
public static Map<String,Object> queryMoreTable( DispatchContext dctx, Map<String,Object> context ){ //取得实体引擎实例
GenericDelegator delegator = dctx.getDelegator(); // 使用动态视图查询批处理信息
// dynamic view entity
DynamicViewEntity dve = new DynamicViewEntity();
//当事人表
dve.addMemberEntity("Party", "Party");
dve.addAliasAll("Party", null); // Party表中的字段全部显示,并且都不设置前缀
//登陆信息表
dve.addMemberEntity("UL", "UserLogin");
dve.addAlias("UL", "userLoginId");
dve.addAlias("UL", "currentPassword");
dve.addAlias("UL", "ulEnabled", "enabled", null, null, null, null); // 重命名
// 左外连接
dve.addViewLink("Party", "UL", Boolean.TRUE, UtilMisc.toList(new ModelKeyMap("partyId", "partyId")));
//个人信息表
dve.addMemberEntity("Person", "Person");
dve.addAlias("Person", "name", "firstName", null, null, null, null); // 重命名
dve.addAlias("Person", "birthDate");
dve.addAlias("Person", "createdStamp");
// 内连接
dve.addViewLink("Party", "Person", Boolean.FALSE, UtilMisc.toList(new ModelKeyMap("partyId", "partyId"))); // 取得查询条件
EntityCondition conditions = EntityCondition.makeCondition("partyTypeId", EntityOperator.EQUALS, "PERSON"); EntityFindOptions opts = new EntityFindOptions();
opts.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); //该字段的设置, 在采用分页查询时才会用到, 因为结果集类型为这个值时,游标才可以向回滚动.
List<GenericValue> personInfos = FastList.newInstance();
int personCount = 0;
EntityListIterator personIterator = null; //实体集合迭代器, 用来操作数据的.和数据库中的结果集功能类似
try {
personIterator = delegator.findListIteratorByCondition(dve, conditions, null, null, null, opts); //查询出符合条件的记录的总个数
personIterator.last(); //让游标移动到最后
personCount = personIterator.currentIndex(); //取出此时的游标索引,就是记录的总个数
//把游标移动到最开始位置
personIterator.beforeFirst(); GenericValue onePerson = null;
while ( personIterator.hasNext() ) {
onePerson = personIterator.next();
personInfos.add(onePerson);
//因为这是个测试程序,为了防止数据溢出,我查询出20条件就不查询了,下面的是检查代码,如果记录已经有20条时,跳出循环.
//在正常使用时,我们一般会分页的方式来解决大数据量问题
if( personInfos.size() >= 20){
break;
}
} } catch (GenericEntityException e) {
Debug.logError(e, module);
//把指定的错误码对应的描述信息返回给服务调用者
return ReturnMapUtil.getErrorMap(DemoErrorMapping.BASE0009,e.getMessage());
} finally {
// 关闭迭代器(一定要记得关闭哦,不然就死定了)
if (UtilValidate.isNotEmpty(personIterator)) {
try {
personIterator.close();
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
}
}
//返回
Map<String, Object> result = FastMap.newInstance();
result.put("personInfos", personInfos);
result.put("personCount", personCount);
return result;
}

  

findListIteratorByCondition源码:
    public EntityListIterator findListIteratorByCondition(DynamicViewEntity dynamicViewEntity, EntityCondition whereEntityCondition, EntityCondition havingEntityCondition, Collection<String> fieldsToSelect, List<String> orderBy, 
      EntityFindOptions findOptions) throws GenericEntityException {
return findListIteratorByCondition(dynamicViewEntity, whereEntityCondition, havingEntityCondition, fieldsToSelect, orderBy, findOptions, false);
}

  

  

  

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

  1. Ofbiz项目学习——阶段性小结——查询

    一.组装参数的学习 首先是查询条件,对于查询条件,需要判断是否从前端传递空值?——怎么处理查询空值? 当然可以一个一个进行判断,但是这样代码会导致很多,可以统一处理,形成一个公共方法. 1. 单个处理 ...

  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. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  8. Spring Boot 项目学习 (一) 项目搭建

    0 引言 本文主要记录借用Idea 开发环境下,搭建 Spring Boot 项目框架的过程. 1 系列文档目录 Spring Boot 项目学习 (一) 项目搭建 Spring Boot 项目学习 ...

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

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

随机推荐

  1. python 将列表里的字典元素合并为一个字典

    python 将列表里的字典元素合并为一个字典 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn. ...

  2. Linux基础(01)开发环境的搭建

    内核源码下载 : https://blog.csdn.net/u011375704/article/details/81866427 1.在虚拟机安装Ubuntu 14.04版本 (安装时设置好用户名 ...

  3. 【搬运工】RHEL6.5 移植使用CentOS 的YUM 步骤

    转载地址:http://www.cnblogs.com/rchen98/p/6056469.html 问题:使用 Red Hat Enterprise Linux Server(RHEL) yum安装 ...

  4. switch/case/default中的雷区

    switch的语法如下: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case常量表达式n: 语句n;break; def ...

  5. IDEA开发React环境配置

    概述 习惯了IDEA写代码,也不想在下一个webstorm,而且IDEA是webstorm的父集,webstorm能干的,IDEA应该也是可以的.本篇随便记录下idea下的react的环境搭建. 环境 ...

  6. ELK学习笔记之Kibana查询和使用说明

    0x00 概述 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 Kibana接口概述 Kibana接口分为四个主要部分: 发现 可视化 仪表板 设置 我们将按照列出的顺 ...

  7. vim中常用折叠命令

    最常用3个折叠命令 .反复打开关闭折叠:za (意思就是,当光标处折叠处于打开状态,za关闭之,当光标处折叠关闭状态,打开之) .打开全部折叠:zR .关闭全部折叠:zM 小试折叠: :set fdm ...

  8. B/S架构详解

    学习笔记:  * B/S架构详解 * 资源分类:            1. 静态资源:                * 使用静态网页开发技术发布的资源.                * 特点:  ...

  9. SQL server数据库创建代码,filegroup文件组修改,

    以下示例在 SQL Server 实例上创建了一个数据库.该数据库包括一个主数据文件.一个用户定义文件组和一个日志文件.主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件.ALTER DAT ...

  10. 将html中的内容生成PDF并且下载

    <head> @*需要引用的js库*@ <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0. ...