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