Oracle ADF VO排序及VO的查询模式

常规应用中,当需要使用Table向终端用户展示数据时,Table中数据的显示排序一致性极大程度的影响到了客户体验。通常希望诸如多次查询结果显示顺序相同、插入数据在原数据上方等的实现。

ADF为开发人员提供了两种级别的排序,即数据库级别的排序及内存级别(In-Memory)的排序。需要同时使用这两种排序法,才能取得合适的排序效果。
    (使用Oracle示例数据库HR中的Employees表作为示例)

  1. 数据源排序
    编辑VO的Query,设置Order by字段,这里设置Manager作为排序字段需要注意的是,这里的排序只是针对从数据源选取数据时的排序,当对VO进行插入/删除操作时,修改并不会立即Commit至数据库,而是存储在EO/VO中,这就导致这种排序法对于不在数据库中存在实体行的数据是无效的,也是需要使用In-Memory排序方式的原因。
  2. VO的查询模式(View Object‘s SQL Mode)
    在开始VO的In-Memory排序之前,首先应该了解VO的查询模式。
    ADF中一个VO具有如下查询模式
    • ViewObject.QUERY_MODE_SCAN_DATABASE_TABLES
      VO的默认查询模式,该模式下VO每次executeQuery时会从数据库检索数据
    • ViewObject.QUERY_MODE_SCAN_VIEW_ROWS
      检索已经存在于VO的Row set中的数据,允许在此查询模式下使用VO的In-Memory Filtering
    • ViewObject.QUERY_MODE_SCAN_ENTITY_ROWS
      检索存储于EO缓存中的数据

    可以使用setQueryMode()方法进行VO查询模式的设置。可以单独设置一个查询模式或使用Java的OR(|)设置多个查询模式。例如

    setQueryMode(ViewObject.QUERY_MODE_SCAN_DATABASE_TABLES | ViewObject.QUERY_MODE_SCAN_ENTITY_ROWS)
    

    当设置多个查询模式时,会自动跳过重复行。
    设置过查询模式后,当执行executeQuery()方法时,查询模式的设置即可生效。

  3. In-Mamory排序
    使用setSortBy()方法进行针对VO的运行时In-Memory排序。setSortBy()方法的输入参数类似于SQL中的order by子句,不同的是将列名称替换为VO上的Attribute Name。例如
    setSortBy("ManagerId desc, EmployeeId");
    

    根据查询模式的设置不同,当执行executeQuery()时,setSortBy()会自动转换为相应的排序方法。如当使用数据库检索时,会将setSortBy转换为ORDER BY子句,当使用In-Memory查询时,会将setSortBy转换为SortCriteria对象。
    使用示例:

    vo.setSortBy("ManagerId");
    vo.setQueryMode(ViewObject.QUERY_MODE_SCAN_VIEW_ROWS);
    vo.executeQuery();
    

    只需要在如插入数据时执行该语句,即可完成In-Memory的排序功能。

  4. 自定义VO的排序方法
    当需要的排序方法比较复杂,使用setSortBy设置排序规则无法满足需求时,可以通过重写VO的public void sortRows(Row[] rows)方法和public Comparator getRowComparator()方法达成目的。其中sortRows方法即是进行In-Memory排序时执行的排序方法;getRowComparater方法返回一个Comparator类型对象,被VO的compareTo()方法调用。
      转载自:http://blog.csdn.net/ice_cuijin/article/details/16842401
时间: 2024-10-09 07:17:58

Oracle ADF VO排序及VO的查询模式的相关文章

用Oracle ADF Essentials 开发Web 应用

Kevin QQ:527358657 Oracle ADF QQ 群:216731341 第一章ADF Essentials 应用开发环境的安装和设置........................................................7 准备...................................................................................................................

Oracle ADF Knowledge

1.refresh : ifNeeded (region) 在一个a.jsff页面里拖了一个taskflow b,b taskflow需要一个输入参数,从a.jsff对应的manage bean里给这个参数传值, 每次一在浏览器调用这个b taskflow的页面总是会报错说这个参数是null. 解决办法:在a.jsff里选中b这个taskflow,在它的属性里设置 refresh : ifNeeded(当有属性什么的变了才会refresh) 2.activation : conditional.

Oracle创建用户并给用户授权查询指定表或视图的权限

MSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND  DEFAULT TABLESPACE "TBS_DNINMSV31"  TEMPORARY TABLESPACE "TEMP2"  QUOTA UNLIMITED ON "TBS_DNINMSV31"; GRANT "CONNECT" TO NORTHBOUND; ALTER USER NO

Oracle、MySql、SQLServer 数据分页查询

Oracle.MySql.SQLServer 数据分页查询 摘自:http://www.cnblogs.com/wangyong/p/3396333.html 近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:

转://Oracle A用户给B用户授权查询指定表或视图权限方案

用DNINMSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAULT TABLESPACE "TBS_DNINMSV31" TEMPORARY TABLESPACE "TEMP2" QUOTA UNLIMITED ON "TBS_DNINMSV31"; GRANT "CONNECT" TO NORTHBOUND;ALTER USER N

Oracle笔记(六) 多表查询

Oracle笔记(六) 多表查询 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一.多表查询的基本概念 在之前所使用的查询操作之中,都是从一张表之中查询出所需要的内容,那么如果现在一个查询语句需要显示多张表的数据,则就必须应用到多表查询的操作,而多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名]

Oracle EBS-SQL (SYS-3):sys_人员用户名对应关系查询.sql

select fu.user_name 用户名,       fu.description 描述,       (select ppf.FULL_NAME          from per_people_f ppf         where ppf.PERSON_ID = fu.employee_id           and trunc(sysdate) between trunc(ppf.EFFECTIVE_START_DATE) and               trunc(ppf

Oracle EBS-SQL (SYS-6):sys_在线用户职责查询2.sql

SELECT FSAV.USER_NAME,FU.DESCRIPTION,FSAV.RESPONSIBILITY_NAME,FSAV.USER_FORM_NAME,FSAV.LOGIN_NAME,FSAV.TIME,FSAV.PID,FSAV.TERMINAL_ID,FSAV.USER_ID,FSAV.RESP_APPL_ID,FSAV.RESPONSIBILITY_ID,FSAV.FORM_ID,FSAV.FORM_APPL_ID FROM FND_SIGNON_AUDIT_VIEW FSAV

ORACLE和SYBASE数据库中实现数据查询条数限制的SQL语句实现

一.概述 对于某些需要通过数据库与大量数据打交道的软件来说,处理性能相当的重要.为了保证软件能够将所有数据处理完而不至于崩溃,分批处理的思想应运而生.分批处理的具体做法是编写SQL语句,每次返回规定条数的数据给软件处理,待这一批数据处理完之后,再接着处理下一批. 本文通过对具体的数据库表(tb_employeeinfo)的操作过程,展示了ORACLE和SYBASE数据库中分批处理SQL语句的编写方法. 二.ORACLE数据库中的处理 首先,建立tb_employeeinfo表,其定义如下: be