spark的自留地(ofbiz/eclipse rcp/shark/opentaps)

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  54 Posts :: 0 Stories :: 112 Comments :: 0 Trackbacks

* 我可以在entitymodel.xml文件中定义自己的view-entities吗?

不能, 你可以动态定义它们.你可以查看org.ofbiz.party.party.PartyServices中的findParty方法学习它的使用

* 如果为有效期间创建条件?

我们提供了一组非常有用的方法EntityUtil.getFilterByDateExpr ,它能返回一个EntityConditionList根据有效期间来筛选一个结果集. 

* 如何在大数据结果集下工作

如果你检出一个大的数据结果集,你应当使用EntityListIterator通过迭代方式读取数据,而非List.
示例,如果你使用:

List products = delegator.findAll("Product");


你可能获得一个"java.lang.OutOfMemoryError".  这是由于你通过findAll, findByAnd, findByCondition等方法来获得一个大的内存数据结果集导致内存溢出.  在这种情况下, 应该使用EntityListIterator迭代方式来读取你的数据. 这个示例应改写成:

productsELI = delegator.findListIteratorByCondition("Product"new EntityExpr("productId", EntityOperator.NOT_EQUAL, null), UtilMisc.toList("productId"), null);

 

注意获得EntityListIterator的方法只用通过条件, 所以你需要将你的条件重写为EntityExpr (在此次情况下,productId是主键字段不可能为空的, 所以将返回所有Proudct实例,)或 EntityConditionList.

此方法参数中包含检出的字段(这里为productId)以及排序字段(这里不需要,所以赋了null)

你可以传递一个null作为EntityCondition参数来获得所有结果.然后这不一定在所有数据库下都能正常工作!  在maxdb及其它不常用的数据库下时你要小心使用这些高级功能.

* 如何使用EntityListIterator

当我们通过EntityListIterator迭代访问数据时, 通常是这样:

while ((nextProduct = productsELI.next()) != null{
.
    
// operations on nextProduct
}


在EntityListIterator 中使用 .hasNext()方法是一种不经济的做法.

在你完成你的操作后,要记得关闭此迭代

productsELI.close();

 

* 如何查询无重结果集

当前只能通过list iterator方法并指定EntityFindOptions参数,示例如下:

    listIt = delegator.findListIteratorByCondition(entityName, findConditions, 
            
null// EntityConditions参数
            fieldsToSelectList, 
            fieldsToOrderByList,  
            
            
//关键部分.  第一个true表示"specifyTypeAndConcur"
            
// 第二个true指完是一个滤重查询.  显然在实体引擎中只能通过这个方法来进行滤重查询
            new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true));

 

在minilang, 它会更简单:

 

  <entity-condition entity-name="${entityName}" list-name="${resultList}" distinct="true">
     
<select field="${fieldName}"/>
     .


* 如何进行一个大小写不敏感的查询(即不分大小写)

你需要查询条件表达式两边均转为大写,示例:

andExprs.add(new EntityExpr("lastName"true, EntityOperator.LIKE, "%"+lastName+"%"true));

     (来源org.ofbiz.party.party.PartyServices)


* 如何将EntityListIterator转换成List

  使用EntityListIterator.getCompleteList() 及getPartialList 方法


* 如何自动获得下一个ID值

  在minilang 中使用 <sequence-id-to-env ...> 或在Java中通过delegator.getNextSeqId(...) 获得 .  id序列存放于SequenceValueItem中.


* 关于ID值的一些警告

  不要在种子/演示数据中使用10000做为数据的ID,当系统尝试自动创建数据时,它们都将尝试10000,这将导致一个键值冲突错误.

* 如何从一个明细项中获得序列ID
  
  有些实体,比如拥有itemSeqId 的InvoiceItem(发票明细项) and OrderItem(订单明细项).此项通常在你处一次为item生成GenericValue 时自动生成ID,之后向delegator要求生成项目的seq Id:

  GenericValue orderItem = delegator.makeValue("OrderItem", orderItemValues);
  delegator.setNextSubSeqId(orderItem, 
"orderItemSeqId", ORDER_ITEM_PADDING, 1);

未完待续>>

本文档译自ofbiz 4.0 cookbooks,本人翻译,欢迎转载,请注明出处.
posted on 2008-10-25 11:42 shanghai_spark 阅读(1522) 评论(1)  编辑  收藏 所属分类: opentaps

Feedback

# re: OFBiz实体引擎开发烹调书 (二) 2008-10-25 13:37 falsh播放器下载
好像很复杂的 以后每天来大哥的播客学下java  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: