zoukankan      html  css  js  c++  java
  • EAS BOS数据查询默认会查分录的分析

    本文与EAS BOS技术相关

     
    在BOS中使用EJB接口获取数据时,你会惊喜的发现,框架会默认把分录的ID给你查出来,但是当你不需要分录数据且分录数据量比较大的情况下,确实给我们带来了些麻烦。
     
     
    例如实体 Team 含有一个分录 Users,现在需要根据ID查询Team数据,通常代码都是这么写的:
     1 EntityViewInfo view = new EntityViewInfo();
     2 view.getSelector().add("id");
     3 view.getSelector().add("name");
     4 view.getSelector().add("number");
     5 
     6 FilterInfo filter = new FilterInfo();
     7 filter.getFilterItems().add(new FilterItemInfo("id",'uuid-bosType'));// ID是主键字段
     8 
     9 view.setFilter(filter);
    10 
    11 TeamCollection colls = TeamFactory.getRemoteInstance().getTeamCollection(view);
    12 
    13 // 正常的情况下colls中只有一个TeamInfo,
    14 TeamInfo team = colls.get(0);
    15 
    16 team.getUsers();// 当执行到这里的时候,你就会发现怎么这里不是空的,而是有很多格式如id='xxxxxxxxxxxxxxxxxxxxxx'
    17 的数据呢???
     
    你和我碰到的问题一样,原因是这样的,BOS默认帮你查出来了。
     
    虽然大多数情况下是需要查询分录数据的,比如:修改单据。
     
    但是,有时只需要查询Team本身的数据即可,不需要users的任何数据,包括主键字段,就像上面的例子;显然EAS BOS中,默认会将单据头及分录的主键字段也查出来,在上述情况下是不必要的。
     
     
    经过分析后发现,EAS BOS中ORMapping的实现中有相关的接口,可以满足上述要求,但是EAS在EJB层没有提供相应的方法。所以经过琢磨,自己在ControllerBean中提供了这样一个方法,实现如下:
     1 protected IObjectCollection _getHeadCollection(Context ctx, EntityViewInfo view) throws BOSException,                                            EASBizException { 
     2      Connection cn = null; 
     3      ORMappingDAO dao = null; 
     4      IObjectCollection datas = null; 
     5       try { 
     6          cn = getConnection(ctx); 
     7          dao = (ORMappingDAO) getDAO(ctx, cn); 
     8          datas = dao.getCollection(view, true); // 关键在这里
     9       } finally { 
    10          SQLUtils.cleanup(cn); 
    11       } 
    12      return datas; 
    13  }  
    上述代码中:getDAO(ctx,cn)为基类提供方法,可以直接使用。
     
    EAS8.2的提供了新的实现方式,先看下ORMappingDAO的源代码实现。你会发现EntityViewInfo中有个isBaseOnSelector属性。
    如果我们在客户端调用获取Collection的接口获取数据时,可以构建一个EntityViewInfo并设置view.setBaseOnSelector(true);
    即可。
     1 public IObjectCollection getCollection(EntityViewInfo view)
     2             throws DataAccessException {
     3         long startTime = System.currentTimeMillis();
     4         try {
     5             if (ThreadScopeLogger.isEnable()) {
     6                 method = "ORMappingDAO.getCollection(EntityViewInfo view)";
     7                 String comment = "Start:";
     8                 comment = comment + view.toString();
     9                 ThreadScopeLogger.loggerCommentItem(method, comment, startTime,
    10                         0L);
    11             }
    12 
    13             String method = innerGetCollection(view, null, view
    14                     .isBaseOnSelector());
    15             long endTime;
    16             String method;
    17             return method;
    18         } finally {
    19             if (ThreadScopeLogger.isEnable()) {
    20                 long endTime = System.currentTimeMillis();
    21                 String method = "ORMappingDAO.getCollection(EntityViewInfo view)";
    22 
    23                 ThreadScopeLogger.loggerOrmappingItem(method, "getCollection",
    24                         startTime, endTime);
    25             }
    26         }
    27     }
     
    框架应该可以动态判断一下是不是需要分录数据,包括分录的主键字段。
     
     
    最后的,最后,我还是忍不住要说一声,这个博客能不能提供个写代码的模板呢.....
     
    KSQL.....(不知道这句嘛意思啊??“看书去了”的简称)
     
  • 相关阅读:
    Find a way(两个BFS)
    ACM代码模板
    ElasticSearch-集群
    ElasticSearch-倒排索引
    ElasticSearch-IK分词器
    ElasticSearch-数据类型
    ElasticSearch-REST APIS
    cmd命令行中的errorlevel和延迟赋值
    ubuntu 12.04内核升级到3.13.1
    ubuntu 12.04安装TP-LINK TL-WN725N v2
  • 原文地址:https://www.cnblogs.com/masb/p/2853830.html
Copyright © 2011-2022 走看看