我有一个页面,其中包含两个数据表。他们的数据是延迟加载和分页的。为了检索我需要的行,我覆盖了 load() 函数的 filterMap。我在初始化 LazyResult 列表时传递了这个 filterMap。不幸的是,这会导致我的 filterMaps 出现问题。
详细地:
1)在我的页面上,我得到以下几行来初始化两个 LazyLists,每个表都用于
<f:event type="preRenderView" listener="#{handler.initTable1}" />
<f:event type="preRenderView" listener="#{handler.initTable2}" />
2) 在我的 ManageBean 中,我正在初始化 LazyList
public void initTable1() {
filterMap.clear();
filterMap.put("organization", "IBM");
lazyResults1= new ResultsLazyList<MyEntity1, MyBean1, MyDTO1>(
myBean1, filterMap);
}
public void initTable2() {
filterMap.clear();
filterMap.put("city", "London");
lazyResults2= new ResultsLazyList<MyEntity2, MyBean2, MyDTO2>(
myBean2, filterMap);
}
在自定义创建的 ResultsLazyList 中,我重写了 LazyDataModel 的加载方法。另请注意,我将构造函数中的filterMap作为参数传递(在 load 方法中使用),这样我从第一次运行时就会得到我想要的结果。
问题
现在,如果我的页面中只有一张表,一切正常。添加更多过滤器、排序等。一旦我添加了第二个表,如上所示,就会发生以下情况。
步骤 1) 在加载客户端页面时,它首先调用initTable1方法。lazyResults1 使用构造函数中设置的 filterMap 进行初始化。尚未触发lazyResults1 的加载方法,此时我的filterMap 具有值organization=IBM
步骤 2) 在加载客户端页面时,它调用initTable2方法。这会用city=London覆盖我的 filterMap 的值并初始化lazyResults2。注意此时lazyResults1或lazyResults2的load方法还没有被触发。
步骤 3) 最后触发加载方法lazyResults1,但 filterMap 包含在 initTable2 中设置的值。因此,在后端,我的应用程序尝试使用MyEntity2上存在的字段查询MyEntity1。
问题
1)有没有办法以某种方式初始化lazyResults1并触发加载方法,以便在调用initTable2()之前加载我的lazyResults1数据并覆盖我的filterMap?
2) 我见过一些人使用 ManagedBeans,每个表都使用,但我想避免这种情况。
3) 另一种方法是在我的 ResultsLazyList 构造函数中通过 2 个 filterMaps。
4)如果有另一种方法可以覆盖加载方法上的filterMap,那么我这样做的方式可能会解决我的问题。