Chapter 8 Accessing the Entities and View Entities

这一章强烈建议对照OFBiz的API来看:http://ci.apache.org/projects/ofbiz/site/javadocs/


Setting-Up Our Playground



由于教程是以OFBiz Release 4.0为基准的,而我们的项目是决定用OFBiz 10.04.02的,存在一定的区别

在试运行test.bsh的时候,我遇到了如下问题:

ERROR rendering error page [/error/error.jsp], but here is the error text: org.ofbiz.widget.screen.ScreenRenderException: Error rendering screen [component://learning/widget/learning/LearningScreens.xml#ProcessEntityAccessBSF]: org.ofbiz.base.util.GeneralException: Error running BSH script at location [component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh] (Error running BSH script at [component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh], line [18]: Sourced file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : Method Invocation this.interpreter.eval : at Line: 18 : in file: /bsh/commands/source.bsh : this .interpreter .eval ( new InputStreamReader ( url .openStream ( ) ) , this .caller .namespace , "URL: " + url .toString ( ) ) Called from method: source : at Line: 20 : in file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : source ( location ) Target exception: Sourced file: URL: file:/E:/apache-ofbiz-10.04.02/hot-deploy/learning/webapp/learning/WEB-INF/actions/entityaccess/test.bsh : Error in method invocation: Method findAll( java.lang.String ) not found in class'org.ofbiz.entity.GenericDelegator' : at Line: 4 : in file: URL: file:/E:/apache-ofbiz-10.04.02/hot-deploy/learning/webapp/learning/WEB-INF/actions/entityaccess/test.bsh : delegator .findAll ( "PostalAddress" ) (Sourced file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : Method Invocation this.interpreter.eval)) (Error running BSH script at location [component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh] (Error running BSH script at [component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh], line [18]: Sourced file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : Method Invocation this.interpreter.eval : at Line: 18 : in file: /bsh/commands/source.bsh : this .interpreter .eval ( new InputStreamReader ( url .openStream ( ) ) , this .caller .namespace , "URL: " + url .toString ( ) ) Called from method: source : at Line: 20 : in file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : source ( location ) Target exception: Sourced file: URL: file:/E:/apache-ofbiz-10.04.02/hot-deploy/learning/webapp/learning/WEB-INF/actions/entityaccess/test.bsh : Error in method invocation: Method findAll( java.lang.String ) not found in class'org.ofbiz.entity.GenericDelegator' : at Line: 4 : in file: URL: file:/E:/apache-ofbiz-10.04.02/hot-deploy/learning/webapp/learning/WEB-INF/actions/entityaccess/test.bsh : delegator .findAll ( "PostalAddress" ) (Sourced file: component://learning/webapp/learning/WEB-INF/actions/entityaccess/processEntityAccessBSF.bsh : Method Invocation this.interpreter.eval)))


表示眼睛花了,从后往前看,有一句值得注意:

Error in method invocation: Method findAll( java.lang.String ) not found in class'org.ofbiz.entity.GenericDelegator' 

我就想会不会是10.04.02版本的delegator没有提供findAll这个方法呢




果然没有,4.0倒是有



findAll的代码如下:


所以仿照这个,我将test.bsh改为



运行,成功!



这是应急的方法,后面文档中提到:


For those keeping up to date with the latest development trunk, two important lookup methods have changed.
  • The method findByPrimaryKey has been replaced with the new findOne method
  • the findAll method has been replaced with findList .
所以,我们应该使用findList来代替findAll


具体的使用方法详见后面查看数据的部分


Creating a Database Record



OFBiz使用Javolution的FastMap和FastList,来代替原有的Map和List,效率更高,更方便使用


关于Javolution的API可以查阅网址:http://javolution.org/target/site/apidocs/index.html


示例代码:
import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;


Map planetValues = UtilMisc.toMap("planetId", "JUPITER", "planetName", "Jupiter");
GenericValue planetGV = delegator.makeValue("Planet", planetValues);
planetGV.create();


planetValues = UtilMisc.toMap("planetId", "EARTH", "planetName", "Earth");
planetGV = delegator.makeValue("Planet", planetValues);
planetGV.create();


planetValues = UtilMisc.toMap("planetId", "MARS", "planetName", "Mars");
planetGV = delegator.makeValue("Planet", planetValues);
planetGV.create();

  • UitlMisc.toMap - Create a map from passed nameX, valueX parameters
  • delegator.makeValue - Creates a GenericValue object that represents a data record in memory
  • planetGV.create() - 写入到数据库中
 

Updating Database Records


import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;


Map planetValues = UtilMisc.toMap("planetId", "JUPITER");
GenericValue planetGV = delegator.findByPrimaryKey("Planet", planetValues);
planetGV.put("planetName", "Joopiter");
planetGV.store();

  • findByPrimaryKey
    java.lang.String - Entity的名字
    java.util.Map - 查找的条件
  • planetGV.put() -修改
  • planetGV.store() - 存入数据库 


注意,虽然目前OFBiz 10.04.02的GenericDelegator仍然有findByPrimaryKey方法,以后很可能用findOne来代替


Deleting Database Records


代码如下:

import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;


Map planetValues = UtilMisc.toMap("planetId", "JUPITER");
GenericValue planetGV = delegator.findByPrimaryKey("Planet", planetValues);
planetGV.remove();
Retrieving Database Records


Retrieving Database Records

OFBiz Release 4.0到OFBiz 10.04.02的一些变动

  • findAll(EntityName) —— findList(EntityName, null, null, null, null,false);
  • findByCondition(entityName, entityCondition, fieldsToSelect, orderBy) —— findList(entityName, entityCondition, fieldsToSelect, orderBy, entityFindOptions, useCache)
  • new EntityExpr(lhs, operator, rhs) —— EntityCondition.makeCondition(lhs, operator, rhs)
  • new EntityConditionList(conditionList, entityJoinOperator) —— EntityCondition.makeCondition(java.util.List<T> conditionList,  entityJoinOperator)

无条件遍历

使用如下代码即可:

findList(EntityName, null, null, null, null,false);

条件遍历

需要先了解如下概念:
  • 条件的表达
    • EntityWhereString - SQL语句描述,OFBiz的开发者强烈不建议使用这个,因为破坏了OFBiz的封装性
    • EntityExpr - 使用OFBiz封装好的操作符来描述一个条件,推荐使用,简单易懂。EntityExpr = 左值 + operator + 右值。我们使用EntityCondition.makeCondition()来生成EntityExpr
  • EntityOperator - 定义了条件中的操作符
    • EQUALS,NOT_EQUAL,LESS_THAN,GREATER_THAN,LESS_THAN_EQUAL_TO (less than or equal to),GREATER_THAN_EQUAL_TO - 用于数值的比较

      condition = EntityCondition.makeCondition("planetId", EntityOperator.NOT_EQUAL,"EARTH");

    • IN,NOT_IN - 规定遍历的结果的某个属性值需要在/不在某个集合中

      condition = EntityCondition.makeCondition("planetId", EntityOperator.IN, UtilMisc.toList("EARTH", "PLUTO"));

    • LIKE,NOT_LIKE - 用于字符串匹配

      condition = new EntityExpr("planetName", EntityOperator.LIKE, "%AR%");
      这里的意思是找出名字里面还有AR的所有planet

      • % - any number of characters
      • _ - any one character
  • EntityConditionList - 由多个EntityExpr连接来。 EntityConditionList = list_of(condition1,condition2,...) + EntityJoinOperator

    conditionList = UtilMisc.toList(EntityCondition.makeCondition("planetName", EntityOperator.LIKE, "%ar%"), 
    					EntityCondition.makeCondition("planetName", EntityOperator.LIKE, "%t%"));
    conditions = EntityCondition.makeCondition(conditionList, EntityOperator.AND);

  • EntityJoinOperator - 两个值AND和OR。其实它是继承EntityOperator得来的,所以使用EntityOperator.AND和EntityOperator.OR也行
  • public List<GenericValue> findList(String entityName, EntityCondition entityCondition, Set<String> fieldsToSelect, List<String> orderBy, EntityFindOptions findOptions, boolean useCache) - 返回查找的列表


    • entityName
    • entityCondition - 查找的条件,可以为EntityExpr,也可以为EntityConditionList,因为他们都是继承于EntityCondition的
    • fieldsToSelect - 结果中需要显示field,即选择要显示的列
    • orderBy - 结果的排序,排序的规则是:orders the retrieved records by those fields. If there is more than one field in the list, ordering is performed by the first field, then the second, and so on。默认是升序排列。如果要降序排列,可以这样:

      order = UtilMisc.toList("planetId DESC");

      注意:此处planetId和DESC之间的空格有且只能有一个,多了少了都会出错,其他地方有多少个空格都无所谓

      或者

      order = UtilMisc.toList("-planetId");
      注意:-和planetId之间不能有空格,否则出错,其他地方空格随意

    • findOptions - 不常用,设为null

      useCache - 不常用,设为false

单一条件查找

import org.ofbiz.base.util.*;
import org.ofbiz.entity.*;
import org.ofbiz.entity.condition.*;

condition = EntityCondition.makeCondition("planetId", EntityOperator.IN,UtilMisc.toList("EARTH", "PLUTO"));
data = delegator.findList("Planet", condition, null, null, null,false);

多条件查找

import org.ofbiz.base.util.*;
import org.ofbiz.entity.*;
import org.ofbiz.entity.condition.*;

conditionList = UtilMisc.toList(EntityCondition.makeCondition("planetName", EntityOperator.LIKE, "%ar%"), 
	EntityCondition.makeCondition("planetName", EntityOperator.LIKE, "%t%"));
conditions = EntityCondition.makeCondition(conditionList, EntityOperator.AND);
data = delegator.findList("Planet", conditions, null, null, null,false);

查找结果排序

import org.ofbiz.base.util.*;
order = UtilMisc.toList("planetId DESC");
data = delegator.findList("Planet", null, null, order, null, false);

选择要结果中Field

import org.ofbiz.base.util.*;
fields = UtilMisc.toSet("planetId", "planetName");
data = delegator.findList("Planet", null, fields, null, null, false);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值