在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)為基類提供方法,可以直接使用。架構應該可以動態判斷一下是不是需要分錄資料,包括分錄的主鍵欄位。轉載註明:http://www.cnblogs.com/masb/archive/2013/01/09/2853830.html