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

187 篇文章 2 订阅
开发环境: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

http://maping930883.blogspot.com/2010/04/adf064adf-bc-where.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值