Skip to content

Commit 2022290

Browse files
committed
search feature:
search with searchDto model with pagination and sort Order
1 parent 08bf25d commit 2022290

7 files changed

Lines changed: 73 additions & 11 deletions

File tree

src/main/java/ir/bigz/springbootreal/controller/SampleController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import ir.bigz.springbootreal.service.UserService;
44
import ir.bigz.springbootreal.viewmodel.UserModel;
5+
import ir.bigz.springbootreal.viewmodel.search.UserSearchDto;
56
import org.springframework.data.domain.Page;
67
import org.springframework.data.domain.Sort;
78
import org.springframework.http.HttpStatus;
@@ -61,12 +62,12 @@ public ResponseEntity<?> getAllUser() {
6162
}
6263

6364
@GetMapping(path = "/user/search", produces = MediaType.APPLICATION_JSON_VALUE)
64-
public ResponseEntity<?> getUserWithSearch(@RequestParam(name = "searchfield") String searchField,
65+
public ResponseEntity<?> getUserWithSearch(@RequestBody UserSearchDto userSearchDto,
6566
@RequestParam(name = "sortorder") String sortOrder,
6667
@RequestParam(name = "direction") String direction,
6768
@RequestParam(name = "pagenumber") Integer pageNumber,
6869
@RequestParam(name = "pagesize") Integer pageSize) {
69-
Page<UserModel> userPageResult = userService.getUserSearchResult(searchField, sortOrder, Sort.Direction.fromString(direction), pageNumber, pageSize);
70+
Page<UserModel> userPageResult = userService.getUserSearchResult(userSearchDto, sortOrder, Sort.Direction.fromString(direction), pageNumber, pageSize);
7071
return ResponseEntity.ok(userPageResult);
7172
}
7273

src/main/java/ir/bigz/springbootreal/dal/DaoRepositoryImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public abstract class DaoRepositoryImpl<T, K extends Serializable> implements Da
2929

3030
protected Class<T> daoType;
3131

32-
private CriteriaBuilder criteriaBuilder;
32+
protected CriteriaBuilder criteriaBuilder;
3333

3434
@SuppressWarnings("unchecked")
3535
protected DaoRepositoryImpl() {
@@ -188,7 +188,6 @@ public Page<T> genericSearch(CriteriaQuery<T> query, Pageable pageable){
188188

189189
long totalCount = totalCountOfEntities();
190190

191-
192191
TypedQuery<T> typedQuery = entityManager.createQuery(query);
193192
List<T> resultList = typedQuery
194193
.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize())
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package ir.bigz.springbootreal.dal;
22

33
import ir.bigz.springbootreal.dao.User;
4+
import ir.bigz.springbootreal.viewmodel.search.UserSearchDto;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
47
import org.springframework.stereotype.Repository;
58

69
@Repository
710
public interface UserRepository extends DaoRepository<User,Long> {
811

912
User getUserWithNationalCode(String nationalCode);
13+
14+
Page<User> getUserSearchResult(UserSearchDto userSearchDto, Pageable pageable);
1015
}

src/main/java/ir/bigz/springbootreal/dal/UserRepositoryImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
package ir.bigz.springbootreal.dal;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
34
import ir.bigz.springbootreal.dao.User;
5+
import ir.bigz.springbootreal.viewmodel.search.UserSearchDto;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.Pageable;
48
import org.springframework.stereotype.Component;
59

10+
import javax.persistence.criteria.CriteriaQuery;
11+
import javax.persistence.criteria.Predicate;
12+
import javax.persistence.criteria.Root;
613
import java.util.ArrayList;
714
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Objects;
17+
import java.util.stream.Collectors;
818

919
@Component
1020
public class UserRepositoryImpl extends DaoRepositoryImpl<User, Long> implements UserRepository {
@@ -22,4 +32,19 @@ public User getUserWithNationalCode(String nationalCode) {
2232
}
2333
return null;
2434
}
35+
36+
@Override
37+
public Page<User> getUserSearchResult(UserSearchDto userSearchDto, Pageable pageable) {
38+
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
39+
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);
47+
Page<User> users = genericSearch(criteriaQuery, pageable);
48+
return users;
49+
}
2550
}

src/main/java/ir/bigz/springbootreal/service/UserService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import ir.bigz.springbootreal.dao.User;
44
import ir.bigz.springbootreal.viewmodel.UserModel;
5+
import ir.bigz.springbootreal.viewmodel.search.UserSearchDto;
56
import org.springframework.data.domain.Page;
67
import org.springframework.data.domain.Sort;
78
import org.springframework.stereotype.Service;
@@ -21,7 +22,7 @@ public interface UserService {
2122

2223
List<UserModel> getAll();
2324

24-
Page<UserModel> getUserSearchResult(String searchField, String sortOrder, Sort.Direction direction, Integer pageNumber, Integer pageSize);
25+
Page<UserModel> getUserSearchResult(UserSearchDto userSearchDto, String sortOrder, Sort.Direction direction, Integer pageNumber, Integer pageSize);
2526

2627
Page<UserModel> getAllUserPage(String sortOrder, Sort.Direction sortDirection, Integer pageNumber, Integer pageSize);
2728
}

src/main/java/ir/bigz/springbootreal/service/UserServiceImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ir.bigz.springbootreal.exception.AppException;
77
import ir.bigz.springbootreal.exception.HttpErrorCode;
88
import ir.bigz.springbootreal.viewmodel.UserModel;
9+
import ir.bigz.springbootreal.viewmodel.search.UserSearchDto;
910
import org.springframework.cache.annotation.CacheEvict;
1011
import org.springframework.cache.annotation.CachePut;
1112
import org.springframework.cache.annotation.Cacheable;
@@ -117,11 +118,11 @@ public List<UserModel> getAll() {
117118

118119
@Override
119120
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
120-
public Page<UserModel> getUserSearchResult(String searchField, String sortOrder, Sort.Direction direction, Integer pageNumber, Integer pageSize) {
121+
public Page<UserModel> getUserSearchResult(UserSearchDto userSearchDto, String sortOrder, Sort.Direction direction, Integer pageNumber, Integer pageSize) {
121122
try {
122-
Pageable pageable = PageRequest.of(pageNumber, pageSize);
123-
String query = "select u from User u order by u.id " + sortOrder;
124-
Page<User> users = userRepository.genericSearch(query, pageable);
123+
Sort.Order order = new Sort.Order(direction, sortOrder);
124+
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(order));
125+
Page<User> users = userRepository.getUserSearchResult(userSearchDto, pageable);
125126
List<UserModel> collect = users.get().map(userMapper::userToUserModel).collect(Collectors.toList());
126127
return new PageImpl<>(collect, pageable, users.getTotalElements());
127128
}catch (RuntimeException exception){
@@ -136,8 +137,8 @@ public Page<UserModel> getUserSearchResult(String searchField, String sortOrder,
136137

137138
@Override
138139
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
139-
public Page<UserModel> getAllUserPage(String sortOrder, Sort.Direction sortDirection, Integer pageNumber, Integer pageSize){
140-
Sort.Order order = new Sort.Order(sortDirection, sortOrder);
140+
public Page<UserModel> getAllUserPage(String sortOrder, Sort.Direction direction, Integer pageNumber, Integer pageSize){
141+
Sort.Order order = new Sort.Order(direction, sortOrder);
141142
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(order));
142143
Page<User> all = userRepository.getAll(pageable);
143144
List<UserModel> collect = all.get().map(userMapper::userToUserModel).collect(Collectors.toList());
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ir.bigz.springbootreal.viewmodel.search;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
import lombok.ToString;
7+
8+
import java.io.Serializable;
9+
10+
@NoArgsConstructor
11+
@Getter
12+
@Setter
13+
@ToString
14+
public class UserSearchDto implements Serializable {
15+
16+
private String firstName;
17+
18+
private String lastName;
19+
20+
private String userName;
21+
22+
private String nationalCode;
23+
24+
private String mobile;
25+
26+
private String email;
27+
28+
private String gender;
29+
30+
}

0 commit comments

Comments
 (0)