更新二: 好的,我设法缩小了一点。
我有一个带有排序和过滤功能的数据表的页面,两者都发生在数据库中。换句话说,我不使用我使用的 rich:datatable 的嵌入式功能,而是让 DB 来完成这项工作。
我使用请求范围的bean。唯一的会话范围 bean 包含我的界面的排序和过滤。
每列的过滤都绑定到特定的会话 bean 字段。因此,它实际上是在更新模型值阶段更新的。
排序需要我的一些逻辑,所以我调用了某种方法来为会话 bean 设置正确的值。这是在调用应用程序阶段执行的。
因此,任何更改都在页面实际呈现的呈现响应阶段进行。
问题是我页面中的 JSF 数据表和 datascroller 在应用请求值阶段也backingBean.getDataModel()
调用了从数据库中获取数据的 和dataModel.getRowCount()
(我已经实现调用运行单独查询的方法) 。这两个查询也发生在渲染响应阶段,这是唯一一个更改全部到位的阶段,查询将正常运行。
这意味着在我执行过滤或排序后显示页面,会发生双倍的查询。
我想执行排序和过滤只执行所需的查询,而不是更多。
有什么建议么?