zoukankan      html  css  js  c++  java
  • 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); }

      

      

      

  • 相关阅读:
    SQL Server中的sysobjects
    SQL:事务(1)
    继续探究HTML与CSS:图像映射
    SQL:事务(2)
    找工作?该复习了!(转)
    继续探究HTML与CSS:!important 和 @import 规则
    JAVA数据结构:二叉树
    SQL:Like 通配符及特殊用法Escape
    JavaScript高级程序设计:在HTML中使用JavaScript
    一个有趣的时钟
  • 原文地址:https://www.cnblogs.com/gzhcsu/p/11199907.html
Copyright © 2011-2022 走看看