Niektóre serwisy w przypadku zaawansowanego wyszukiwania wykorzystują zdefiniowane filtry, za pomocą których możemy określić kryteria wyszukiwania.

Przydatne klasy:

  • HibernateFilter - interfejs udostępniający metodę buildCriterion(), która zwraca odpowiednio zbudowane kryterium.
  • SimpleHibernateFilter - implementacja HibernateFilter, dająca możliwość definiowania kryteriów wyszukiwania.
  • GroupHibernateFilter - implementacja HibernateFilter, umożliwiająca grupowanie filtrów za pomocą operatorów logicznych AND i OR.

Przedstawione poniżej przykłady operować będą na klasie User, która mapuje tabelę usertable w bazie danych.

Do budowania filtrów jako pola, należy używać nazw pól zdefiniowanych w mapowanych klasach.

 

SimpleHibernateFilter filter = new SimpleHibernateFilter( "userName", "jkowalski" ); //użytkownik o loginie "jkowalski"
 
//LUB
 
SimpleHibernateFilter filter = new SimpleHibernateFilter( "userName", "jkowalski", FilterOperator.NOTEQ ); //użytkownicy, poza użytkownikiem o loginie "jkowalski"

W pierwszym filtrze nie zdefiniowaliśmy operatora, dlatego uwzględniany jest domyślny operator EQ. Filtr ten ogranicza wyszukiwanie do użytkownika o loginie "jkowalski". Drugi filtr nadaje ograniczenie na użytkowników poza użytkownikiem o loginie "jkowalski". Świadczy o tym operator NOTEQ.

 

//Tworzymy grupę warunków połączonych operatorem logicznym 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);

Powyższy przykład prezentuje filtry połączone warunkiem logicznym OR. Tak skonstruowany filtr wyszuka użytkowników których login lub imię lub nazwisko zaczynają się na literę "j".

 

//Tworzymy grupę warunków połączonych operatorem logicznym OR
GroupHibernateFilter mainGroupFilter = new GroupHibernateFilter();
mainGroupFilter.setLogicOperator( LogicOperator.OR );

//Tworzymy grupę warunków połączonych operatorem logicznym 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);


//Tworzymy grupę warunków połączonych operatorem logicznym AND (jeżeli nie zdefiniujemy operatora to domyślnie jest nim AND)
SimpleHibernateFilter filter3 = new SimpleHibernateFilter( "userName", "jkowalski" );
subGroupFilter2.addFilter(filter3);

mainGroupFilter.addFilter( subGroupFilter );
mainGroupFilter.addFilter( filter3 );

W powyższym przykładzie został zdefiniowany złożony filtr grupowy. Wynikiem takiej implementacji będzie następujący warunek:

 ( userName like "j%" AND firstName like "k% ) OR ( userName = "jkowalski" )

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" )