本文与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.....(不知道这句嘛意思啊??“看书去了”的简称)