Skip to content

Commit 6aa5bae

Browse files
committed
improve pageable feature
1 parent b0b2958 commit 6aa5bae

5 files changed

Lines changed: 141 additions & 23 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
@@ -67,4 +67,13 @@ public ResponseEntity<?> getPage(@RequestParam(name = "pagenumber") Integer page
6767
return ResponseEntity.ok(userPageResult);
6868
}
6969

70+
71+
@GetMapping(path = "/user/all", produces = MediaType.APPLICATION_JSON_VALUE)
72+
public ResponseEntity<?> getAllUserPage(@RequestParam(name = "pagenumber") Integer pageNumber,
73+
@RequestParam(name = "pagesize") Integer pageSize,
74+
@RequestParam(name = "sortorder") String sortOrder) {
75+
Page<UserModel> userPageResult = userService.getAllUserPagebale(pageNumber, pageSize, sortOrder);
76+
return ResponseEntity.ok(userPageResult);
77+
}
78+
7079
}

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

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

33
import org.springframework.data.domain.Page;
44
import org.springframework.data.domain.Pageable;
5+
import org.springframework.data.domain.Sort;
56
import org.springframework.stereotype.Repository;
67

78
import java.io.Serializable;
9+
import javax.persistence.criteria.CriteriaQuery;
810
import java.util.List;
911
import java.util.Optional;
1012
import java.util.stream.Stream;
@@ -21,13 +23,17 @@ public interface DaoRepository<T, K extends Serializable> {
2123
<S extends T> void delete(S entity);
2224
void delete(K id);
2325
void deleteAll();
24-
Stream<T> getAll();
2526
Optional<T> find(K id);
2627
<S extends T> List<S> find(List<K> entityIds);
2728
<S extends T> List<S> find(String entityName);
2829
List<T> genericSearch(String query);
2930
void flush();
3031
void clear();
3132

33+
Stream<T> getAll();
34+
List<T> getAll(Sort sort);
35+
Page<T> getAll(Pageable pageable);
36+
List<T> genericSearch(CriteriaQuery<T> criteriaQuery);
37+
Page<T> genericSearch(CriteriaQuery<T> criteriaQuery, Pageable pageable);
3238
Page<T> genericSearch(String query, Pageable pageable);
3339
}

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

Lines changed: 111 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package ir.bigz.springbootreal.dal;
2-
3-
import ir.bigz.springbootreal.dao.User;
42
import org.hibernate.Session;
53
import org.springframework.data.domain.Page;
64
import org.springframework.data.domain.PageImpl;
75
import org.springframework.data.domain.Pageable;
6+
import org.springframework.data.domain.Sort;
87
import org.springframework.stereotype.Component;
98
import org.springframework.transaction.annotation.Propagation;
109
import org.springframework.transaction.annotation.Transactional;
1110

11+
import javax.annotation.PostConstruct;
1212
import javax.management.openmbean.InvalidOpenTypeException;
13-
import javax.persistence.EntityManager;
14-
import javax.persistence.PersistenceContext;
15-
import javax.persistence.TypedQuery;
13+
import javax.persistence.*;
14+
import javax.persistence.criteria.*;
1615
import java.io.Serializable;
1716
import java.lang.reflect.ParameterizedType;
1817
import java.lang.reflect.Type;
18+
import java.util.ArrayList;
19+
import java.util.Iterator;
1920
import java.util.List;
2021
import java.util.Optional;
2122
import java.util.stream.Stream;
@@ -26,18 +27,22 @@ public abstract class DaoRepositoryImpl<T, K extends Serializable> implements Da
2627
@PersistenceContext
2728
private EntityManager entityManager;
2829

29-
private Class<T> daoType;
30+
protected Class<T> daoType;
3031

31-
// public void setDaoType(Class<T> daoType){
32-
// this.daoType = daoType;
33-
// }
32+
private CriteriaBuilder criteriaBuilder;
3433

35-
public DaoRepositoryImpl() {
34+
@SuppressWarnings("unchecked")
35+
protected DaoRepositoryImpl() {
3636
Type t = getClass().getGenericSuperclass();
3737
ParameterizedType pt = (ParameterizedType) t;
3838
daoType = (Class<T>) pt.getActualTypeArguments()[0];
3939
}
4040

41+
@PostConstruct
42+
public void init() {
43+
criteriaBuilder = entityManager.getCriteriaBuilder();
44+
}
45+
4146
@Override
4247
public Object getORMapper() {
4348
return entityManager;
@@ -95,14 +100,6 @@ public void deleteAll() {
95100

96101
}
97102

98-
@Override
99-
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
100-
public Stream<T> getAll() {
101-
Session session = entityManager.unwrap(Session.class);
102-
return session.createQuery("from " + daoType.getName()).stream();
103-
// return entityManager.createQuery("from " + daoType.getName()).getResultStream();
104-
}
105-
106103
@Override
107104
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
108105
public Optional<T> find(K id) throws IllegalArgumentException {
@@ -137,14 +134,107 @@ public void clear() {
137134
entityManager.clear();
138135
}
139136

137+
@SuppressWarnings("unchecked")
140138
@Override
139+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
140+
public Stream<T> getAll() {
141+
Session session = entityManager.unwrap(Session.class);
142+
return session.createQuery("from " + daoType.getName()).stream();
143+
}
144+
145+
@Override
146+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
147+
public List<T> getAll(Sort sort) {
148+
CriteriaQuery<T> query = criteriaBuilder.createQuery(daoType);
149+
Root<T> root = query.from(daoType);
150+
query.orderBy(orderByClauseBuilder(root, sort));
151+
query.select(root);
152+
TypedQuery<T> typedQuery = entityManager.createQuery(query);
153+
return typedQuery.getResultList();
154+
}
155+
156+
@Override
157+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
158+
public Page<T> getAll(Pageable pageable) {
159+
160+
long totalCount = totalCountOfEntities();
161+
162+
CriteriaQuery<T> query = criteriaBuilder.createQuery(daoType);
163+
Root<T> root = query.from(daoType);
164+
165+
if(!pageable.getSort().isEmpty())
166+
query.orderBy(orderByClauseBuilder(root, pageable.getSort()));
167+
168+
query.select(root);
169+
170+
TypedQuery<T> typedQuery = entityManager.createQuery(query);
171+
typedQuery.setFirstResult((pageable.getPageNumber()-1) * pageable.getPageSize());
172+
typedQuery.setMaxResults(pageable.getPageSize());
173+
174+
return new PageImpl<>(typedQuery.getResultList(), pageable, totalCount);
175+
176+
}
177+
178+
@Override
179+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
180+
public List<T> genericSearch(CriteriaQuery<T> criteriaQuery) {
181+
TypedQuery<T> tq = entityManager.createQuery(criteriaQuery);
182+
return tq.getResultList();
183+
}
184+
185+
@Override
186+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
187+
public Page<T> genericSearch(CriteriaQuery<T> query, Pageable pageable){
188+
189+
long totalCount = totalCountOfEntities();
190+
191+
192+
TypedQuery<T> typedQuery = entityManager.createQuery(query);
193+
List<T> resultList = typedQuery
194+
.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize())
195+
.setMaxResults(pageable.getPageSize()).getResultList();
196+
197+
return new PageImpl<>(resultList, pageable, totalCount);
198+
}
199+
200+
@Override
201+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
141202
public Page<T> genericSearch(String query, Pageable pageable){
203+
142204
TypedQuery<T> countQuery = entityManager.createQuery(query, daoType);
143205
int totalCount = countQuery.getResultList().size();
144206

145207
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);
208+
List<T> resultList = typedQuery
209+
.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize())
210+
.setMaxResults(pageable.getPageSize()).getResultList();
211+
212+
return new PageImpl<>(resultList, pageable, totalCount);
213+
}
214+
215+
216+
protected long totalCountOfEntities() {
217+
CriteriaQuery<Long> query = criteriaBuilder.createQuery(Long.class);
218+
Root<T> root = query.from(daoType);
219+
Expression<Long> exp1 = criteriaBuilder.count(root);
220+
query.select(exp1);
221+
TypedQuery<Long> typedQuery = entityManager.createQuery(query);
222+
return typedQuery.getSingleResult();
223+
}
224+
225+
protected List<Order> orderByClauseBuilder(Root<T> root, Sort sort){
226+
227+
List<Order> orders = new ArrayList<>();
228+
Iterator<Sort.Order> iterator = sort.iterator();
229+
while(iterator.hasNext()){
230+
Sort.Order order = iterator.next();
231+
if(order.getDirection() == Sort.Direction.ASC){
232+
orders.add(criteriaBuilder.asc(root.get(order.getProperty())));
233+
}
234+
else{
235+
orders.add(criteriaBuilder.desc(root.get(order.getProperty())));
236+
}
237+
}
238+
return orders;
149239
}
150240
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ public interface UserService {
2121
List<UserModel> getAll();
2222

2323
Page<UserModel> getUserSearchResult(Integer pageNumber, Integer pageSize, String sortOrder);
24+
25+
Page<UserModel> getAllUserPagebale(Integer pageNumber, Integer pageSize, String sortOrder);
2426
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public Page<UserModel> getUserSearchResult(Integer pageNumber, Integer pageSize,
123123
String query = "select u from User u order by u.id " + sortOrder;
124124
Page<User> users = userRepository.genericSearch(query, pageable);
125125
List<UserModel> collect = users.get().map(userMapper::userToUserModel).collect(Collectors.toList());
126-
return new PageImpl(collect, pageable, users.getTotalElements());
126+
return new PageImpl<>(collect, pageable, users.getTotalElements());
127127
}catch (RuntimeException exception){
128128
throw AppException.newInstance(
129129
HttpErrorCode.ERR_10701,
@@ -133,6 +133,17 @@ public Page<UserModel> getUserSearchResult(Integer pageNumber, Integer pageSize,
133133

134134
}
135135

136+
137+
@Override
138+
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
139+
public Page<UserModel> getAllUserPagebale(Integer pageNumber, Integer pageSize, String sortOrder){
140+
Sort.Order order = new Sort.Order(Sort.Direction.ASC, sortOrder);
141+
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(order));
142+
Page<User> all = userRepository.getAll(pageable);
143+
List<UserModel> collect = all.get().map(userMapper::userToUserModel).collect(Collectors.toList());
144+
return new PageImpl<>(collect, pageable, all.getTotalElements());
145+
}
146+
136147
private void mapUserForUpdate(User sourceUser, User updateUser){
137148
if(!sourceUser.getFirstName().equals(updateUser.getFirstName())){
138149
sourceUser.setFirstName(updateUser.getFirstName());

0 commit comments

Comments
 (0)