开发环境: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类。
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
在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
http://maping930883.blogspot.com/2010/04/adf064adf-bc-where.html