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

摘要:
视图包含行和列,就像真实的表一样。视图中的字段是一个或多个数据库中真实表中的字段。

一、简要介绍

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项目学习——阶段性小结——视图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇widget 常用UI控件介绍Windows聚焦失效问题的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql中的view(虚拟表)

视图是从一个或多个表/视图中导出来的虚拟表。mysql支持可更新的视图。 1 创建 CREATE [OR REPLACE] ##使用这个选项,若视图已存在,则等图create,若视图不存在,则等同alter [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = {...

DB2 错误码解析

DB2 错误代码大全——SQLSTATE 消息   SQLSTATE 消息本节列示 SQLSTATE 及其含义。SQLSTATE 是按类代码进行分组的;对于子代码,请参阅相应的表。 表 2. SQLSTATE 类代码 类 代码   含义 要获得子代码, 参阅... 00 完全成功完成 表 3 01 警告 表 4 02 无数据 表 5 07 动态 SQL ...

第4章 数据库安全性 | 数据库知识点整理

第4章 数据库安全性 了解 计算机系统安全性问题 数据库安全性问题 威胁数据库安全性因素 掌握 TCSEC和CC标准的主要内容 C2级DBMS、B1级DBMS的主要特征DBMS提供的安全措施 用户身份鉴别、自主存取控制、强制存取控制技术 视图技术和审计技术 数据加密存储和加密传输 使用SQL语言中的GRANT语句和REVOKE语句来实现自主存...

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而...

php---laravel5框架的使用

路由器的使用: //在浏览器直接访问,跳转到welcome视图,视图路径在public/resources/views/ Route::get('/', function () { return view('welcome'); }); //在浏览器直接访问,返回hello world Route::get("route1", function...

Django基础(1)

昨日内容回顾: 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2协议 请求头 key:value 请求体 a=1&b=2(只有post请求才有请求体) 响应协议...