55import ir .bigz .springbootreal .viewmodel .search .UserSearchDto ;
66import org .springframework .data .domain .Page ;
77import org .springframework .data .domain .Pageable ;
8+ import org .springframework .data .domain .Sort ;
89import org .springframework .stereotype .Component ;
910
10- import javax .persistence .criteria .CriteriaQuery ;
11- import javax .persistence .criteria .Predicate ;
12- import javax .persistence .criteria .Root ;
13- import java .util .ArrayList ;
14- import java .util .List ;
15- import java .util .Map ;
16- import java .util .Objects ;
11+ import javax .persistence .criteria .*;
12+ import java .lang .reflect .Field ;
13+ import java .sql .Timestamp ;
14+ import java .util .*;
1715import java .util .stream .Collectors ;
1816
1917@ Component
@@ -34,17 +32,41 @@ public User getUserWithNationalCode(String nationalCode) {
3432 }
3533
3634 @ Override
37- public Page <User > getUserSearchResult (UserSearchDto userSearchDto , Pageable pageable ) {
35+ public Page <User > getUserSearchResult (UserSearchDto userSearchDto , Sort .Order order , Pageable pageable ) {
36+
3837 CriteriaQuery <User > criteriaQuery = criteriaBuilder .createQuery (User .class );
3938 Root <User > userRoot = criteriaQuery .from (User .class );
40- Map < String , String > map = new ObjectMapper (). convertValue ( userSearchDto , Map . class );
41- List < Predicate > collect = map . keySet () .stream ().filter ( s -> ( Objects . nonNull ( map . get ( s )) && !( map . get ( s ). equals ( "" ))))
42- . map ( s -> criteriaBuilder . like ( userRoot . get ( s ), "%" + map . get ( s )+ "%" ))
43- . collect ( Collectors . toList ());
44- Predicate [] predicates = collect . stream (). toArray ( Predicate []:: new );
45- Predicate and = criteriaBuilder . and ( predicates );
46- criteriaQuery .where ( and );
39+ List < Predicate > searchConditions = getSqlCondition ( userSearchDto , criteriaBuilder , userRoot );
40+ Predicate concatConditions = criteriaBuilder . and ( searchConditions .stream ().toArray ( Predicate []:: new ));
41+ criteriaQuery . where ( concatConditions );
42+ if ( order . getDirection (). name (). equals ( "ASC" ))
43+ criteriaQuery . orderBy ( criteriaBuilder . asc ( userRoot . get ( order . getProperty ())) );
44+ else
45+ criteriaQuery .orderBy ( criteriaBuilder . desc ( userRoot . get ( order . getProperty ())) );
4746 Page <User > users = genericSearch (criteriaQuery , pageable );
4847 return users ;
4948 }
49+
50+ private <T ,K > List <Predicate > getSqlCondition (T searchModel , CriteriaBuilder criteriaBuilder , Root <K > root ){
51+ List <Field > collect = Arrays .stream (searchModel .getClass ().getDeclaredFields ()).collect (Collectors .toList ());
52+ Map <String , String > map = new ObjectMapper ().convertValue (searchModel , Map .class );
53+
54+ return map .keySet ().stream ()
55+ .filter (s -> (Objects .nonNull (map .get (s )) && !(map .get (s ).equals ("" ))))
56+ .flatMap (s -> collect .stream ().filter (field -> field .getName ().equals (s )))
57+ .map (field -> {
58+ if (field .getType ().getName ().contains ("String" ))
59+ return criteriaBuilder .like (root .get (field .getName ()), "%" + map .get (field .getName ()) + "%" );
60+ else if (field .getType ().getName ().contains ("Timestamp" )){
61+ if (field .getName ().contains ("from" ) || field .getName ().contains ("start" )){
62+ return criteriaBuilder .greaterThanOrEqualTo (root .get (field .getName ()), map .get (field .getName ()));
63+ }
64+ else
65+ return criteriaBuilder .lessThanOrEqualTo (root .get (field .getName ()), map .get (field .getName ()));
66+ }
67+ else
68+ return criteriaBuilder .equal (root .get (field .getName ()), map .get (field .getName ()));
69+ })
70+ .collect (Collectors .toList ());
71+ }
5072}
0 commit comments