Commit e33812769e3919f20871115d9d8bc216bc6002df

Authored by Vanderson Silva
1 parent 2d7b9aad
Exists in master

inclusao do método 'createCountQueryString' e remoção do parâmetro

'List<Predicate> predicates' do método findByCriteriaQuery
impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java
... ... @@ -39,6 +39,8 @@ package br.gov.frameworkdemoiselle.template;
39 39 import java.lang.reflect.Field;
40 40 import java.util.ArrayList;
41 41 import java.util.List;
  42 +import java.util.regex.Matcher;
  43 +import java.util.regex.Pattern;
42 44  
43 45 import javax.enterprise.inject.Instance;
44 46 import javax.inject.Inject;
... ... @@ -185,10 +187,9 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
185 187 pagination = getPagination();
186 188 TypedQuery<T> listQuery = getEntityManager().createQuery(jpql, getBeanClass());
187 189 if (pagination != null) {
188   - int indexFrom = jpql.toUpperCase().indexOf("FROM");
189   - String countJPQL = "SELECT count(*) " + jpql.substring(indexFrom);
190   - Query query= getEntityManager().createQuery(countJPQL);
191   - Number cResults=(Number) query.getSingleResult();
  190 + String countQueryString = createCountQueryString(jpql);
  191 + Query query = getEntityManager().createQuery(countQueryString);
  192 + Number cResults = (Number) query.getSingleResult();
192 193 pagination.setTotalResults(cResults.intValue());
193 194 listQuery.setFirstResult(pagination.getFirstResult());
194 195 listQuery.setMaxResults(pagination.getPageSize());
... ... @@ -201,14 +202,14 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
201 202 * @param criteriaQuery - structure CriteriaQuery
202 203 * @return a list of entities
203 204 */
204   - public List<T> findByCriteriaQuery(CriteriaQuery<T> criteriaQuery, List<Predicate> predicates) {
  205 + public List<T> findByCriteriaQuery(CriteriaQuery<T> criteriaQuery) {
205 206 pagination = getPagination();
206 207 TypedQuery<T> listQuery = getEntityManager().createQuery(criteriaQuery);
207 208 if (pagination != null) {
208 209 CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
209 210 CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
210 211 countQuery.select(builder.count(countQuery.from(getBeanClass())));
211   - countQuery.where(predicates.toArray(new Predicate[] {}));
  212 + countQuery.where(criteriaQuery.getRestriction());
212 213 getEntityManager().createQuery(countQuery);
213 214 pagination.setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0));
214 215 listQuery.setFirstResult(pagination.getFirstResult());
... ... @@ -217,6 +218,26 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
217 218 return listQuery.getResultList();
218 219 }
219 220  
  221 + /**
  222 + * Converts JPA query to JPA count query
  223 + * @param query
  224 + * @return
  225 + */
  226 + private String createCountQueryString(String query) {
  227 + Matcher matcher = Pattern.compile("SELECT(.+)FROM").matcher(query);
  228 + if (matcher.find()){
  229 + String group = matcher.group(1).trim();
  230 + query = query.replaceFirst(group, "COUNT(" + group + ")");
  231 + matcher = Pattern.compile("ORDER(.+)").matcher(query);
  232 + if (matcher.find()){
  233 + group = matcher.group(1);
  234 + query = query.replaceFirst("ORDER"+group, "");
  235 + }
  236 + return query;
  237 + }else{
  238 + throw new DemoiselleException(bundle.get().getString("malformed-jpql"));
  239 + }
  240 + }
220 241  
221 242 /**
222 243 * Retrieves the number of persisted objects for the current class type.
... ...
impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties
... ... @@ -41,4 +41,5 @@ can-not-get-persistence-unit-from-persistence=N\u00E3o foi poss\u00EDvel obter a
41 41 more-than-one-persistence-unit-defined=Existe mais de uma unidade de persist\u00EAncia definida. Utilize @{0} no ponto de inje\u00E7\u00E3o ou defina o atributo "frameworkdemoiselle.persistence.unit.name" no arquivo demoiselle.properties.
42 42 persistence-unit-name-found=Unidade de persist\u00EAncia "{0}" encontrada.
43 43 entity-manager-closed=O gerenciador de entidades foi fechado.
44   -no-transaction-active=Nenhuma transa\u00E7\u00E3o est\u00E1 ativa, verifique a configura\u00E7\u00E3o "{0}" no arquivo "{1}" e defina a sua estrat\u00E9gia de transa\u00E7\u00E3o.
45 44 \ No newline at end of file
  45 +no-transaction-active=Nenhuma transa\u00E7\u00E3o est\u00E1 ativa, verifique a configura\u00E7\u00E3o "{0}" no arquivo "{1}" e defina a sua estrat\u00E9gia de transa\u00E7\u00E3o.
  46 +malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados.
... ...