11package ir .bigz .springbootreal .dal ;
2-
3- import ir .bigz .springbootreal .dao .User ;
42import org .hibernate .Session ;
53import org .springframework .data .domain .Page ;
64import org .springframework .data .domain .PageImpl ;
75import org .springframework .data .domain .Pageable ;
6+ import org .springframework .data .domain .Sort ;
87import org .springframework .stereotype .Component ;
98import org .springframework .transaction .annotation .Propagation ;
109import org .springframework .transaction .annotation .Transactional ;
1110
11+ import javax .annotation .PostConstruct ;
1212import 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 .*;
1615import java .io .Serializable ;
1716import java .lang .reflect .ParameterizedType ;
1817import java .lang .reflect .Type ;
18+ import java .util .ArrayList ;
19+ import java .util .Iterator ;
1920import java .util .List ;
2021import java .util .Optional ;
2122import 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}
0 commit comments