langping86

stay hungry,stay foolish.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文与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.....(不知道这句嘛意思啊??“看书去了”的简称)
 
posted on 2013-01-09 23:11  masb  阅读(1827)  评论(0编辑  收藏  举报