Apply Filter on af:table column programmatically,Invoke ‘FilterableQueryDescriptor’

Sharing is Caring

Hello All
This tutorial is about a requirement and the query is how to apply filter on af:table column through managed bean code.
To achieve this we can invoke FilterableQueryDescriptor (FilterableQueryDescriptor is an abstract subclass of QueryDescriptor. It adds support for filtering of data and is typically used by the table component to filter data from a query ). Suppose I have department table and I have to filter on department name column but I don’t want to use the default table filter functionality.

  • Create a Fusion Web Application and prepare business components for Departments (HR Schema) table
  • Now drag table on the page and create its component binding in the managed bean.
Apply Filter on af:table
  • Drop an input text and a button on the page to manually enter Department Name
  • Bind input text to managed bean and create ActionListener on the button to filter Department Table

Here you can see XML source of Page-

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <f:view>
        <af:document title="filterPage.jspx" id="d1">
            <af:messages id="m1"/>
            <af:form id="f1">
                <af:inputText label="Department Name" id="it5"
                              binding="#{pageFlowScope.FilterProgrammaticBean.deptNmBind}"/>
                <af:commandButton text="Filter" id="cb1"
                                  actionListener="#{pageFlowScope.FilterProgrammaticBean.filterTableAction}"/>
                <af:table value="#{bindings.DepartmentsView1.collectionModel}" var="row"
                          rows="#{bindings.DepartmentsView1.rangeSize}"
                          emptyText="#{bindings.DepartmentsView1.viewable ? 'No data to display.' : 'Access Denied.'}"
                          fetchSize="#{bindings.DepartmentsView1.rangeSize}" rowBandingInterval="1"
                          selectedRowKeys="#{bindings.DepartmentsView1.collectionModel.selectedRow}"
                          selectionListener="#{bindings.DepartmentsView1.collectionModel.makeCurrent}"
                          rowSelection="single" id="t1" styleClass="AFStretchWidth"
                          binding="#{pageFlowScope.FilterProgrammaticBean.deptTabBind}"
                          filterModel="#{bindings.DepartmentsView1Query.queryDescriptor}"
                          queryListener="#{bindings.DepartmentsView1Query.processQuery}" filterVisible="true"
                          varStatus="vs">
                    <af:column sortProperty="#{bindings.DepartmentsView1.hints.DepartmentId.name}" sortable="true"
                               headerText="#{bindings.DepartmentsView1.hints.DepartmentId.label}" id="c1"
                               filterable="true">
                        <af:inputText value="#{row.bindings.DepartmentId.inputValue}"
                                      label="#{bindings.DepartmentsView1.hints.DepartmentId.label}"
                                      required="#{bindings.DepartmentsView1.hints.DepartmentId.mandatory}"
                                      columns="#{bindings.DepartmentsView1.hints.DepartmentId.displayWidth}"
                                      maximumLength="#{bindings.DepartmentsView1.hints.DepartmentId.precision}"
                                      shortDesc="#{bindings.DepartmentsView1.hints.DepartmentId.tooltip}" id="it1"
                                      readOnly="true">
                            <f:validator binding="#{row.bindings.DepartmentId.validator}"/>
                            <af:convertNumber groupingUsed="false"
                                              pattern="#{bindings.DepartmentsView1.hints.DepartmentId.format}"/>
                        </af:inputText>
                    </af:column>
                    <af:column sortProperty="#{bindings.DepartmentsView1.hints.DepartmentName.name}" sortable="true"
                               headerText="#{bindings.DepartmentsView1.hints.DepartmentName.label}" id="c2"
                               filterable="true">
                        <af:inputText value="#{row.bindings.DepartmentName.inputValue}"
                                      label="#{bindings.DepartmentsView1.hints.DepartmentName.label}"
                                      required="#{bindings.DepartmentsView1.hints.DepartmentName.mandatory}"
                                      columns="#{bindings.DepartmentsView1.hints.DepartmentName.displayWidth}"
                                      maximumLength="#{bindings.DepartmentsView1.hints.DepartmentName.precision}"
                                      shortDesc="#{bindings.DepartmentsView1.hints.DepartmentName.tooltip}" id="it2"
                                      readOnly="true">
                            <f:validator binding="#{row.bindings.DepartmentName.validator}"/>
                        </af:inputText>
                    </af:column>
                    <af:column sortProperty="#{bindings.DepartmentsView1.hints.ManagerId.name}" sortable="true"
                               headerText="#{bindings.DepartmentsView1.hints.ManagerId.label}" id="c3"
                               filterable="true">
                        <af:inputText value="#{row.bindings.ManagerId.inputValue}"
                                      label="#{bindings.DepartmentsView1.hints.ManagerId.label}"
                                      required="#{bindings.DepartmentsView1.hints.ManagerId.mandatory}"
                                      columns="#{bindings.DepartmentsView1.hints.ManagerId.displayWidth}"
                                      maximumLength="#{bindings.DepartmentsView1.hints.ManagerId.precision}"
                                      shortDesc="#{bindings.DepartmentsView1.hints.ManagerId.tooltip}" id="it3"
                                      readOnly="true">
                            <f:validator binding="#{row.bindings.ManagerId.validator}"/>
                            <af:convertNumber groupingUsed="false"
                                              pattern="#{bindings.DepartmentsView1.hints.ManagerId.format}"/>
                        </af:inputText>
                    </af:column>
                    <af:column sortProperty="#{bindings.DepartmentsView1.hints.LocationId.name}" sortable="true"
                               headerText="#{bindings.DepartmentsView1.hints.LocationId.label}" id="c4"
                               filterable="true">
                        <af:inputText value="#{row.bindings.LocationId.inputValue}"
                                      label="#{bindings.DepartmentsView1.hints.LocationId.label}"
                                      required="#{bindings.DepartmentsView1.hints.LocationId.mandatory}"
                                      columns="#{bindings.DepartmentsView1.hints.LocationId.displayWidth}"
                                      maximumLength="#{bindings.DepartmentsView1.hints.LocationId.precision}"
                                      shortDesc="#{bindings.DepartmentsView1.hints.LocationId.tooltip}" id="it4"
                                      readOnly="true">
                            <f:validator binding="#{row.bindings.LocationId.validator}"/>
                            <af:convertNumber groupingUsed="false"
                                              pattern="#{bindings.DepartmentsView1.hints.LocationId.format}"/>
                        </af:inputText>
                    </af:column>
                </af:table>
            </af:form>
        </af:document>
    </f:view>
</jsp:root>

Managed Bean Code to apply filter on af:table column-

package filter.view;

import java.util.Map;

import javax.faces.event.ActionEvent;

import oracle.adf.view.rich.component.rich.data.RichTable;
import oracle.adf.view.rich.component.rich.input.RichInputText;
import oracle.adf.view.rich.context.AdfFacesContext;
import oracle.adf.view.rich.event.QueryEvent;
import oracle.adf.view.rich.model.FilterableQueryDescriptor;

public class FilterProgrammaticBean {
    private RichInputText deptNmBind;
    private RichTable deptTabBind;

    public FilterProgrammaticBean() {
    }

    public void setDeptNmBind(RichInputText deptNmBind) {
        this.deptNmBind = deptNmBind;
    }

    public RichInputText getDeptNmBind() {
        return deptNmBind;
    }

    public void setDeptTabBind(RichTable deptTabBind) {
        this.deptTabBind = deptTabBind;
    }

    public RichTable getDeptTabBind() {
        return deptTabBind;
    }

    /**Method to invoke FilterableQueryDescriptor and Filter Department table
 * @param actionEvent
 */
    public void filterTableAction(ActionEvent actionEvent) {
RichTable tbl = this.getDeptTabBind();
FilterableQueryDescriptor filterQD = (FilterableQueryDescriptor)tbl.getFilterModel();
Map filterCriteria = filterQD.getFilterCriteria();
filterCriteria.put("DepartmentName", deptNmBind.getValue());
getDeptTabBind().queueEvent(new QueryEvent(getDeptTabBind(), filterQD));
AdfFacesContext.getCurrentInstance().addPartialTarget(this.getDeptTabBind());
    }
}

Run your Application and put some value in Department Name field on the page and press filter button, You can see that value is automatically populated in filter of table column and data is filtered.

Filtered Data in af:table

Sample ADF Application- Download

Cheers:) Happy Learning

Related Posts

An Oracle ACE, Blogger, Reviewer, Technical Lead working on Oracle ADF

9 thoughts on “Apply Filter on af:table column programmatically,Invoke ‘FilterableQueryDescriptor’”

  1. is there a new approach available as the getFilterCriteria method is now Deprecated in FilterableQueryDescriptor

  2. SO i was trying to do this
    RichTable tbl = this.getTable();
    FilterableQueryDescriptor filterQD = (FilterableQueryDescriptor)tbl.getFilterModel();
    ConjunctionCriterion cc = filterQD.getFilterConjunctionCriterion();

    the variable "cc" gives me null value. what am I missing ?

  3. Hi, Yes I did filtermodel, filterVisible is set on the Table and the af column has filterable property set to true as well. Still it doesnt works.
    FilterableQueryDescriptor queryDescriptor = (FilterableQueryDescriptor) getSearchTabBind().getFilterModel();

    that queryDescriptor always return null for me.

Leave a Reply

Your email address will not be published. Required fields are marked *