2010年4月10日星期六

ADF_064:使用ADF-BC 实现查询功能之四:通过代码动态设置Where条件参数

开发环境:JDevloper 11.1.2.1.0+ Oracle Database 10g Express Edition 10.2.0.1。

在VO上设置Where条件子句并绑定一个参数后,有时我们需要在代码中动态设置参数值。
更有一种情况是:动态为VO增加条件参数并设置参数值。
以下我就以《使用ADF-BC 实现查询功能之二:ExecuteWithParams》的项目为基础,说明如何实现动态查询。

1. 动态设置参数值
在本例中,已经为EmployeesView绑定一个参数:bv_email。
为了更清楚地说明如何实现,我使用一个单独的Java类来实现,以下代码完全可以用在Managed Bean中。
主要代码如下:
(1)首先获取Application Moudule实例
String amDef = "model.AppModule";
String amConfig = "AppModuleLocal";
ApplicationModule am = Configuration.createRootApplicationModule(amDef, amConfig);
(2)然后获取EmployeesView实例
ViewObject vo = am.findViewObject("EmployeesView1");
(3)接着设置Where语句中的参数,这里bv_email即在VO中的绑定的变量名称。
vo.setNamedWhereClauseParam("bv_email", "M%");
(4)最后执行VO对象上的executeQuery()方法。

运行结果如下: 可以看出,这里只显示Email以”M“开头的用户:
--------------Query Result-----------------
130 Mozhe Atkinson MATKINSO
201 Michael Hartstein MHARTSTE
164 Mattea Marvins MMARVINS
134 Michael Rogers MROGERS
182 Martha Sullivan MSULLIVA
120 Matthew Weiss MWEISS

2. 动态增加参数
步骤(1)和(2)与上面相同
(3)新增查询条件
//新增一个条件子句,注意原来定义在VO上的Where子句依然有效,Where子句之间是”AND"的关系。
//这里EMPLOYEE_ID是数据库字段名称,bv_employeeId就是新增的参数,在VO中并没有定义这个参数。
vo.setWhereClause("EMPLOYEE_ID = :bv_employeeId");
// 定义参数:bv_employeeId
vo.defineNamedWhereClauseParam("bv_employeeId", null, null);
// 给参数:bv_employeeId赋值
vo.setNamedWhereClauseParam("bv_employeeId", new Number(120));
// 执行查询
executeAndShowResults(vo);
// 清空参数
vo.removeNamedWhereClauseParam("bv_employeeId");
// 清空动态增加的条件子句,如果不清空,新增的条件子句将一直存在
// 注意,这里只能清空动态增加的条件,VO上定义的条件子句不能通过代码清空。
vo.setWhereClause(null);

输出结果如下:可以看出这个结果是在两个条件取交集的结果。
--------------Query Result-----------------
120 Matthew Weiss MWEISS

3. 完整的TestVOBindVarsClient.java内容如下:
可以直接右键运行此类,事先无需为AM或VO生成Java类。

package model;

import oracle.jbo.ApplicationModule;
import oracle.jbo.Row;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.domain.Number;

public class TestVOBindVarsClient {
public TestVOBindVarsClient() {
super();
}

public static void main(String[] args) {
String amDef = "model.AppModule";
String amConfig = "AppModuleLocal";
ApplicationModule am = Configuration.createRootApplicationModule(amDef, amConfig);
ViewObject vo = am.findViewObject("EmployeesView1");

//testcase 1:
vo.setNamedWhereClauseParam("bv_email", "M%");
executeAndShowResults(vo);

//testcase 2:
vo.setWhereClause("EMPLOYEE_ID = :bv_employeeId");
vo.defineNamedWhereClauseParam("bv_employeeId", null, null);
vo.setNamedWhereClauseParam("bv_employeeId", new Number(120));
executeAndShowResults(vo);
// empty param
vo.removeNamedWhereClauseParam("bv_employeeId");
// empty where clause
vo.setWhereClause(null);

// release am
Configuration.releaseRootApplicationModule(am, true);
}

private static void executeAndShowResults(ViewObject vo) {
System.out.println("--------------Query Result-----------------");
vo.executeQuery();
while (vo.hasNext()) {
Row emp = vo.next();
System.out.println(emp.getAttribute("EmployeeId") + " " + emp.getAttribute("FirstName") + " " +
emp.getAttribute("LastName") + " " + emp.getAttribute("Email"));
}
}
}


Project 下载:ADF_Query_ExecuteWithParams(3).7z

参考文献:
1. http://adfcodebits.blogspot.com/2010/05/bit-18-dynamically-changing-view.html
2. http://formattc.wordpress.com/2010/04/02/custom-java-bind-variable-in-a-where-clause-of-an-adf-view-object/
3. https://blogs.oracle.com/jdevotnharvest/entry/whats_the_difference_between_view_crite ria_and_where_clause
4. http://blog.csdn.net/luyushuang/article/details/6635880
5. http://jobinesh.blogspot.com/2010/10/creating-view-criteria-having-bind.html

没有评论: