Skip to content

Commit b0b2958

Browse files
committed
pagination feature:
add pagination basic implementation
1 parent 8eb7336 commit b0b2958

7 files changed

Lines changed: 55 additions & 4 deletions

File tree

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

Lines changed: 9 additions & 0 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 org.springframework.data.domain.Page;
56
import org.springframework.http.HttpStatus;
67
import org.springframework.http.MediaType;
78
import org.springframework.http.ResponseEntity;
@@ -58,4 +59,12 @@ public ResponseEntity<?> getAllUser() {
5859
return ResponseEntity.ok(result);
5960
}
6061

62+
@GetMapping(path = "/user/search", produces = MediaType.APPLICATION_JSON_VALUE)
63+
public ResponseEntity<?> getPage(@RequestParam(name = "pagenumber") Integer pageNumber,
64+
@RequestParam(name = "pagesize") Integer pageSize,
65+
@RequestParam(name = "sortorder") String sortOrder) {
66+
Page<UserModel> userPageResult = userService.getUserSearchResult(pageNumber, pageSize, sortOrder);
67+
return ResponseEntity.ok(userPageResult);
68+
}
69+
6170
}

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

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

3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.Pageable;
35
import org.springframework.stereotype.Repository;
46

57
import java.io.Serializable;
@@ -26,4 +28,6 @@ public interface DaoRepository<T, K extends Serializable> {
2628
List<T> genericSearch(String query);
2729
void flush();
2830
void clear();
31+
32+
Page<T> genericSearch(String query, Pageable pageable);
2933
}

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

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

3+
import ir.bigz.springbootreal.dao.User;
34
import org.hibernate.Session;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.PageImpl;
7+
import org.springframework.data.domain.Pageable;
48
import org.springframework.stereotype.Component;
59
import org.springframework.transaction.annotation.Propagation;
610
import org.springframework.transaction.annotation.Transactional;
711

812
import javax.management.openmbean.InvalidOpenTypeException;
913
import javax.persistence.EntityManager;
1014
import javax.persistence.PersistenceContext;
15+
import javax.persistence.TypedQuery;
1116
import java.io.Serializable;
1217
import java.lang.reflect.ParameterizedType;
1318
import java.lang.reflect.Type;
@@ -131,4 +136,15 @@ public void flush() {
131136
public void clear() {
132137
entityManager.clear();
133138
}
139+
140+
@Override
141+
public Page<T> genericSearch(String query, Pageable pageable){
142+
TypedQuery<T> countQuery = entityManager.createQuery(query, daoType);
143+
int totalCount = countQuery.getResultList().size();
144+
145+
TypedQuery<T> typedQuery = entityManager.createQuery(query, daoType);
146+
List<T> resultList = typedQuery.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize())
147+
.setMaxResults(pageable.getPageSize()).getResultList();
148+
return new PageImpl(resultList, pageable, totalCount);
149+
}
134150
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
@Repository
77
public interface UserRepository extends DaoRepository<User,Long> {
88

9-
User getUserWithNationalId(String nationalId);
9+
User getUserWithNationalCode(String nationalCode);
1010
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
public class UserRepositoryImpl extends DaoRepositoryImpl<User, Long> implements UserRepository {
1111

1212
@Override
13-
public User getUserWithNationalId(String nationalId) {
13+
public User getUserWithNationalCode(String nationalCode) {
1414

1515
List<User> resultList = new ArrayList<>();
16-
String query = "select u from User u where u.nationalId like '" + nationalId + "'";
16+
String query = "select u from User u where u.nationalCode like '" + nationalCode + "'";
1717

1818
resultList = genericSearch(query);
1919

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

Lines changed: 3 additions & 0 deletions
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 org.springframework.data.domain.Page;
56
import org.springframework.stereotype.Service;
67

78
import java.util.List;
@@ -18,4 +19,6 @@ public interface UserService {
1819
String deleteUser(long userId);
1920

2021
List<UserModel> getAll();
22+
23+
Page<UserModel> getUserSearchResult(Integer pageNumber, Integer pageSize, String sortOrder);
2124
}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.cache.annotation.CacheEvict;
1010
import org.springframework.cache.annotation.CachePut;
1111
import org.springframework.cache.annotation.Cacheable;
12+
import org.springframework.data.domain.*;
1213
import org.springframework.stereotype.Component;
1314
import org.springframework.transaction.annotation.Isolation;
1415
import org.springframework.transaction.annotation.Propagation;
@@ -51,7 +52,7 @@ public UserModel getUser(Long userId) {
5152
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
5253
public UserModel addUser(UserModel userModel) {
5354
try {
54-
if(userRepository.getUserWithNationalId(userModel.getNationalCode()) == null){
55+
if(userRepository.getUserWithNationalCode(userModel.getNationalCode()) == null){
5556
User user = userMapper.userModelToUser(userModel);
5657
return userMapper.userToUserModel(userRepository.insert(user));
5758
}
@@ -114,6 +115,24 @@ public List<UserModel> getAll() {
114115

115116
}
116117

118+
@Override
119+
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
120+
public Page<UserModel> getUserSearchResult(Integer pageNumber, Integer pageSize, String sortOrder) {
121+
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);
125+
List<UserModel> collect = users.get().map(userMapper::userToUserModel).collect(Collectors.toList());
126+
return new PageImpl(collect, pageable, users.getTotalElements());
127+
}catch (RuntimeException exception){
128+
throw AppException.newInstance(
129+
HttpErrorCode.ERR_10701,
130+
String.format("getAll method has error: %s", exception.getCause())
131+
);
132+
}
133+
134+
}
135+
117136
private void mapUserForUpdate(User sourceUser, User updateUser){
118137
if(!sourceUser.getFirstName().equals(updateUser.getFirstName())){
119138
sourceUser.setFirstName(updateUser.getFirstName());

0 commit comments

Comments
 (0)