OFBiz实体引擎开发烹调书 (二)

OFBiz实体引擎开发烹调书 (二)

* 我可以在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,本人翻译,欢迎转载,请注明出处.

你可能感兴趣的:(OFBiz实体引擎开发烹调书 (二))