在本人的 ADF(UI)--<af:table>数据的延迟加载(二)中描述使用Vo的executeEmptyRowSet()可以使首次进入页面时不执行SQL,返回结果集,可以加快页面响应速度,而在ADF(BC)--当使用绑定VO的<af:table>时可能会导致的内存问题则谈到在使用<af:table>为避免内存问题,需要在大结果集的VO使用分页模式,即设置VO的AccessModel 为Range Paging或Range Paging incremental,但有一个问题是,当我们设置VO的分页访问模式时,也需要想在第一次进入页面不执行查询而使用VO的executeEmptyRowSet()时,则会存在冲突,VO还是会一开始执行查询。(这可能是ADF的bug或者设计者出于其他原因的考虑)。
为实现上述目标,可以通过动态改变VO的AccessModel实现,注意AccessModel可以在运行时有默认的Scrollable模式改为Range Paging或Range Paging incremental,但反之则不行。但这没关系,我们并不想从分页的模式改成非分页模式。实现方法是:1、不改变VO的默认访问模式,即在VO定义文件保留默认设置AccessModel=Scrollable,2、根据 ADF(UI)--<af:table>数据的延迟加载(二)例子实现,3、为动态改变VO的AccessModel,可生产VO的实现类,重新executeQuery()方法,如下图:
运行起来,符合想要的效果,一切OK。当初我也这样想,但后面发现一旦VO发生钝化和激活时,在激活过程中会报“索引中丢失 IN 或 OUT 参数::1”,如下图:
经调试发现,动态设置的AccessModel在钝化时会丢失,而激活后VO的访问模式会恢复默认。知道原因则好不,实现思路是重新VO的激活状态方法,在这里重新设置AccessModel为分页模式。如下图:
现在终于可以松一口气了。