Some services for advanced search use defined filters with which we can specify search criteria.
Useful classes
- HibernateFilter - an interface that provides the buildCriterion() method, which returns an appropriately built criterion.
- SimpleHibernateFilter - an implementation of HibernateFilter, providing the ability to define search criteria.
- GroupHibernateFilter - an implementation of HibernateFilter, providing the ability to group filters using AND and OR logical operators.
The examples below will operate on the User class, which maps the usertable table in the database.
To build filters as fields, use the field names defined in the mapped classes.
SimpleHibernateFilter filter = new SimpleHibernateFilter( "userName", "jkowalski" ); //user with login "jkowalski" //LUB SimpleHibernateFilter filter = new SimpleHibernateFilter( "userName", "jkowalski", FilterOperator.NOTEQ ); //users, except for the user with the login "jkowalski"
In the first filter, we have not defined an operator, so the default EQ operator is included. This filter restricts the search to the user with the login "jkowalski". The second filter gives a restriction on users other than the user with the login "jkowalski". This is evidenced by the NOTEQ operator.
//Create a group of conditions connected by a logical operator OR GroupHibernateFilter groupFilter = new GroupHibernateFilter(); groupFilter.setLogicOperator( LogicOperator.OR ); SimpleHibernateFilter filter1 = new SimpleHibernateFilter( "userName", "j%", FilterOperator.LIKE ); groupFilter.addFilter(filter1); SimpleHibernateFilter filter2 = new SimpleHibernateFilter( "firstName", "j%", FilterOperator.LIKE ); groupFilter.addFilter(filter2); SimpleHibernateFilter filter3 = new SimpleHibernateFilter( "lastName", "j%", FilterOperator.LIKE ); groupFilter.addFilter(filter3);
The above example presents filters connected by a logical OR condition. A filter constructed in this way will search for users whose login or first or last name begins with the letter "j".
//Create a group of conditions connected by a logical operator OR GroupHibernateFilter mainGroupFilter = new GroupHibernateFilter(); mainGroupFilter.setLogicOperator( LogicOperator.OR ); //Create a group of conditions connected by a logical operator AND GroupHibernateFilter subGroupFilter = new GroupHibernateFilter(); subGroupFilter1.setLogicOperator( LogicOperator.AND ); SimpleHibernateFilter filter1 = new SimpleHibernateFilter( "userName", "j%", FilterOperator.LIKE ); subGroupFilter.addFilter(filter1); SimpleHibernateFilter filter2 = new SimpleHibernateFilter( "firstName", "k%", FilterOperator.LIKE ); subGroupFilter.addFilter(filter2); //Create a group of conditions connected by a logical operator AND (if you don't define an operator it defaults to AND) SimpleHibernateFilter filter3 = new SimpleHibernateFilter( "userName", "jkowalski" ); subGroupFilter2.addFilter(filter3); mainGroupFilter.addFilter( subGroupFilter ); mainGroupFilter.addFilter( filter3 );
In the above example, a complex group filter has been defined. The result of such an implementation will be the following condition:
( userName like "j%" AND firstName like "k% ) OR ( userName = "jkowalski" )