同时查询数据库和缓存中的数据

参考:ADF VO排序及VO的三种查询模式(转)

方法一

public class CuxPosAddrTaxRequestVOImpl extends OAViewObjectImpl {
    /**This is the default constructor (do not remove)
     */
    public CuxPosAddrTaxRequestVOImpl() {
    }
    
    
    public void queryAddTaxRequest(String AddressRequestId)
    {
      if ((AddressRequestId != null) && (!("".equals(AddressRequestId.trim()))))
      {
          setMaxFetchSize(-1);
        // Do the following conversion for type consistency.
         Number nAddressRequestId = null;
         try
         {
           nAddressRequestId = new Number(AddressRequestId);
         } catch (Exception e)
         {
           throw new OAException("PON", "CUX_POS_INVALID_NUMBER");
         }
         
        
          setWhereClause(null);
          setWhereClauseParams(null);
          addQueryMode(this.QUERY_MODE_SCAN_DATABASE_TABLES | 
                       this.QUERY_MODE_SCAN_ENTITY_ROWS);
        
          ViewCriteria vc = this.createViewCriteria();
          ViewCriteriaRow vcr = vc.createViewCriteriaRow();
          //设定标准查询参数,可以多个,参数与Attribute类型一定要一致
          vcr.setAttribute("AddressRequestId", nAddressRequestId);
          vcr.setConjunction(ViewCriteriaRow.VCROW_CONJ_AND);
          vc.setCriteriaMode(ViewCriteria.CRITERIA_MODE_QUERY | 
                             ViewCriteria.CRITERIA_MODE_CACHE);
          vc.addElement(vcr);
          this.applyViewCriteria(vc);          
                       
        
//        this.setWhereClause("ADDRESS_REQUEST_ID =" + nAddressRequestId);
        

        executeQuery();
      }
    }
}

 

 

方法二:待验证

      vo.setWhereClause(whereClause);
      vo.setWhereClauseParams(null);
      vo.setWhereClauseParam(0, entityId);
      
      if(associationConsistent)
        vo.setAssociationConsistent(associationConsistent);
      vo.executeQuery();
      vo.reset();

 

 


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

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

 

    1. 数据源排序和缓存排序
      数据源的排序只是针对从数据源选取数据时的排序,当对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()方法调用。

转载于:https://www.cnblogs.com/huanghongbo/p/5684478.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值