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,6 +39,8 @@ package br.gov.frameworkdemoiselle.template;
39 import java.lang.reflect.Field; 39 import java.lang.reflect.Field;
40 import java.util.ArrayList; 40 import java.util.ArrayList;
41 import java.util.List; 41 import java.util.List;
  42 +import java.util.regex.Matcher;
  43 +import java.util.regex.Pattern;
42 44
43 import javax.enterprise.inject.Instance; 45 import javax.enterprise.inject.Instance;
44 import javax.inject.Inject; 46 import javax.inject.Inject;
@@ -185,10 +187,9 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -185,10 +187,9 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
185 pagination = getPagination(); 187 pagination = getPagination();
186 TypedQuery<T> listQuery = getEntityManager().createQuery(jpql, getBeanClass()); 188 TypedQuery<T> listQuery = getEntityManager().createQuery(jpql, getBeanClass());
187 if (pagination != null) { 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 pagination.setTotalResults(cResults.intValue()); 193 pagination.setTotalResults(cResults.intValue());
193 listQuery.setFirstResult(pagination.getFirstResult()); 194 listQuery.setFirstResult(pagination.getFirstResult());
194 listQuery.setMaxResults(pagination.getPageSize()); 195 listQuery.setMaxResults(pagination.getPageSize());
@@ -201,14 +202,14 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -201,14 +202,14 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
201 * @param criteriaQuery - structure CriteriaQuery 202 * @param criteriaQuery - structure CriteriaQuery
202 * @return a list of entities 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 pagination = getPagination(); 206 pagination = getPagination();
206 TypedQuery<T> listQuery = getEntityManager().createQuery(criteriaQuery); 207 TypedQuery<T> listQuery = getEntityManager().createQuery(criteriaQuery);
207 if (pagination != null) { 208 if (pagination != null) {
208 CriteriaBuilder builder = getEntityManager().getCriteriaBuilder(); 209 CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
209 CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 210 CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
210 countQuery.select(builder.count(countQuery.from(getBeanClass()))); 211 countQuery.select(builder.count(countQuery.from(getBeanClass())));
211 - countQuery.where(predicates.toArray(new Predicate[] {})); 212 + countQuery.where(criteriaQuery.getRestriction());
212 getEntityManager().createQuery(countQuery); 213 getEntityManager().createQuery(countQuery);
213 pagination.setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0)); 214 pagination.setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0));
214 listQuery.setFirstResult(pagination.getFirstResult()); 215 listQuery.setFirstResult(pagination.getFirstResult());
@@ -217,6 +218,26 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; { @@ -217,6 +218,26 @@ public class JPACrud&lt;T, I&gt; implements Crud&lt;T, I&gt; {
217 return listQuery.getResultList(); 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 * Retrieves the number of persisted objects for the current class type. 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,4 +41,5 @@ can-not-get-persistence-unit-from-persistence=N\u00E3o foi poss\u00EDvel obter a
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. 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 persistence-unit-name-found=Unidade de persist\u00EAncia "{0}" encontrada. 42 persistence-unit-name-found=Unidade de persist\u00EAncia "{0}" encontrada.
43 entity-manager-closed=O gerenciador de entidades foi fechado. 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 \ No newline at end of file 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.