Commit 9d773bb1cacbb9dab46e591de2b8960f8f42b0a9

Authored by Wilson Guimarães
1 parent 1279fa34
Exists in master

Tratamento do pull-request que resolveu problemas na paginação.

impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java
@@ -94,7 +94,6 @@ public class JPACrud<T, I> implements Crud<T, I> { @@ -94,7 +94,6 @@ public class JPACrud<T, I> implements Crud<T, I> {
94 private Class<T> beanClass; 94 private Class<T> beanClass;
95 95
96 protected Class<T> getBeanClass() { 96 protected Class<T> getBeanClass() {
97 -  
98 if (this.beanClass == null) { 97 if (this.beanClass == null) {
99 this.beanClass = Reflections.getGenericTypeArgument(this.getClass(), 0); 98 this.beanClass = Reflections.getGenericTypeArgument(this.getClass(), 0);
100 } 99 }
@@ -115,6 +114,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -115,6 +114,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
115 PaginationContext context = paginationContext.get(); 114 PaginationContext context = paginationContext.get();
116 pagination = context.getPagination(getBeanClass()); 115 pagination = context.getPagination(getBeanClass());
117 } 116 }
  117 +
118 return pagination; 118 return pagination;
119 } 119 }
120 120
@@ -130,6 +130,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -130,6 +130,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
130 if (cause instanceof TransactionRequiredException) { 130 if (cause instanceof TransactionRequiredException) {
131 String message = bundle.get().getString("no-transaction-active", "frameworkdemoiselle.transaction.class", 131 String message = bundle.get().getString("no-transaction-active", "frameworkdemoiselle.transaction.class",
132 Configuration.DEFAULT_RESOURCE); 132 Configuration.DEFAULT_RESOURCE);
  133 +
133 throw new DemoiselleException(message, cause); 134 throw new DemoiselleException(message, cause);
134 135
135 } else { 136 } else {
@@ -168,75 +169,74 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -168,75 +169,74 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
168 169
169 /** 170 /**
170 * Search JPQL integrated into the context of paging 171 * Search JPQL integrated into the context of paging
171 - * @param jpql - query in syntax JPQL 172 + *
  173 + * @param jpql
  174 + * - query in syntax JPQL
172 * @return a list of entities 175 * @return a list of entities
173 */ 176 */
174 protected List<T> findByJPQL(String jpql) { 177 protected List<T> findByJPQL(String jpql) {
175 - pagination = getPagination();  
176 TypedQuery<T> listQuery = getEntityManager().createQuery(jpql, getBeanClass()); 178 TypedQuery<T> listQuery = getEntityManager().createQuery(jpql, getBeanClass());
177 - if (pagination != null) {  
178 - String countQueryString = createCountQueryString(jpql);  
179 - Query query = getEntityManager().createQuery(countQueryString);  
180 - Number cResults = (Number) query.getSingleResult();  
181 - pagination.setTotalResults(cResults.intValue());  
182 - listQuery.setFirstResult(pagination.getFirstResult());  
183 - listQuery.setMaxResults(pagination.getPageSize()); 179 +
  180 + if (getPagination() != null) {
  181 + String countQuery = createCountQuery(jpql);
  182 + Query query = getEntityManager().createQuery(countQuery);
  183 + Number cResults = (Number) query.getSingleResult();
  184 + getPagination().setTotalResults(cResults.intValue());
  185 + listQuery.setFirstResult(getPagination().getFirstResult());
  186 + listQuery.setMaxResults(getPagination().getPageSize());
184 } 187 }
  188 +
185 return listQuery.getResultList(); 189 return listQuery.getResultList();
186 } 190 }
187 191
188 /** 192 /**
189 * Search CriteriaQuery integrated into the context of paging 193 * Search CriteriaQuery integrated into the context of paging
190 - * @param criteriaQuery - structure CriteriaQuery 194 + *
  195 + * @param criteriaQuery
  196 + * - structure CriteriaQuery
191 * @return a list of entities 197 * @return a list of entities
192 */ 198 */
193 public List<T> findByCriteriaQuery(CriteriaQuery<T> criteriaQuery) { 199 public List<T> findByCriteriaQuery(CriteriaQuery<T> criteriaQuery) {
194 - pagination = getPagination();  
195 TypedQuery<T> listQuery = getEntityManager().createQuery(criteriaQuery); 200 TypedQuery<T> listQuery = getEntityManager().createQuery(criteriaQuery);
196 - if (pagination != null) { 201 +
  202 + if (getPagination() != null) {
197 CriteriaBuilder builder = getEntityManager().getCriteriaBuilder(); 203 CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
198 CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 204 CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
199 countQuery.select(builder.count(countQuery.from(getBeanClass()))); 205 countQuery.select(builder.count(countQuery.from(getBeanClass())));
200 countQuery.where(criteriaQuery.getRestriction()); 206 countQuery.where(criteriaQuery.getRestriction());
201 getEntityManager().createQuery(countQuery); 207 getEntityManager().createQuery(countQuery);
202 - pagination.setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0));  
203 - listQuery.setFirstResult(pagination.getFirstResult());  
204 - listQuery.setMaxResults(pagination.getPageSize()); 208 + getPagination().setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0));
  209 + listQuery.setFirstResult(getPagination().getFirstResult());
  210 + listQuery.setMaxResults(getPagination().getPageSize());
205 } 211 }
  212 +
206 return listQuery.getResultList(); 213 return listQuery.getResultList();
207 } 214 }
208 - 215 +
209 /** 216 /**
210 - * Converts JPA query to JPA count query 217 + * Converts a query into a count query
  218 + *
211 * @param query 219 * @param query
212 * @return 220 * @return
213 */ 221 */
214 - private String createCountQueryString(String query) {  
215 - query = query.toUpperCase();  
216 - Matcher matcher = Pattern.compile("SELECT(.+)FROM").matcher(query);  
217 - if (matcher.find()){  
218 - String group = matcher.group(1).trim();  
219 - query = query.replaceFirst(group, "COUNT(" + group + ")");  
220 - matcher = Pattern.compile("ORDER(.+)").matcher(query);  
221 - if (matcher.find()){  
222 - group = matcher.group(1);  
223 - query = query.replaceFirst("ORDER"+group, "");  
224 - }  
225 - return query;  
226 - }else{  
227 - throw new DemoiselleException(bundle.get().getString("malformed-jpql"));  
228 - }  
229 - } 222 + private String createCountQuery(String query) {
  223 + Matcher matcher = Pattern.compile("[Ss][Ee][Ll][Ee][Cc][Tt](.+)[Ff][Rr][Oo][Mm]").matcher(query);
230 224
231 - /**  
232 - * Retrieves the number of persisted objects for the current class type.  
233 - *  
234 - * @return the row count  
235 - */  
236 - private Long countAll() {  
237 - final Query query = getEntityManager().createQuery(  
238 - "select count(this) from " + beanClass.getSimpleName() + " this");  
239 - return (Long) query.getSingleResult(); 225 + if (matcher.find()) {
  226 + String group = matcher.group(1).trim();
  227 + query = query.replaceFirst(group, "COUNT(" + group + ")");
  228 + matcher = Pattern.compile("[Oo][Rr][Dd][Ee][Rr](.+)").matcher(query);
  229 +
  230 + if (matcher.find()) {
  231 + group = matcher.group(0);
  232 + query = query.replaceFirst(group, "");
  233 + }
  234 +
  235 + return query;
  236 +
  237 + } else {
  238 + throw new DemoiselleException(bundle.get().getString("malformed-jpql"));
  239 + }
240 } 240 }
241 241
242 /** 242 /**
@@ -267,7 +267,6 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -267,7 +267,6 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
267 * @return an instance of {@code CriteriaQuery} 267 * @return an instance of {@code CriteriaQuery}
268 */ 268 */
269 private CriteriaQuery<T> createCriteriaByExample(final T example) { 269 private CriteriaQuery<T> createCriteriaByExample(final T example) {
270 -  
271 final CriteriaBuilder builder = getCriteriaBuilder(); 270 final CriteriaBuilder builder = getCriteriaBuilder();
272 final CriteriaQuery<T> query = builder.createQuery(getBeanClass()); 271 final CriteriaQuery<T> query = builder.createQuery(getBeanClass());
273 final Root<T> entity = query.from(getBeanClass()); 272 final Root<T> entity = query.from(getBeanClass());
@@ -276,7 +275,6 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -276,7 +275,6 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
276 final Field[] fields = example.getClass().getDeclaredFields(); 275 final Field[] fields = example.getClass().getDeclaredFields();
277 276
278 for (Field field : fields) { 277 for (Field field : fields) {
279 -  
280 if (!field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Basic.class) 278 if (!field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Basic.class)
281 && !field.isAnnotationPresent(Enumerated.class)) { 279 && !field.isAnnotationPresent(Enumerated.class)) {
282 continue; 280 continue;
@@ -287,10 +285,13 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -287,10 +285,13 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
287 try { 285 try {
288 field.setAccessible(true); 286 field.setAccessible(true);
289 value = field.get(example); 287 value = field.get(example);
  288 +
290 } catch (IllegalArgumentException e) { 289 } catch (IllegalArgumentException e) {
291 continue; 290 continue;
  291 +
292 } catch (IllegalAccessException e) { 292 } catch (IllegalAccessException e) {
293 continue; 293 continue;
  294 +
294 } 295 }
295 296
296 if (value == null) { 297 if (value == null) {
@@ -300,6 +301,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -300,6 +301,7 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
300 final Predicate pred = builder.equal(entity.get(field.getName()), value); 301 final Predicate pred = builder.equal(entity.get(field.getName()), value);
301 predicates.add(pred); 302 predicates.add(pred);
302 } 303 }
  304 +
303 return query.where(predicates.toArray(new Predicate[0])).select(entity); 305 return query.where(predicates.toArray(new Predicate[0])).select(entity);
304 } 306 }
305 307