From e33812769e3919f20871115d9d8bc216bc6002df Mon Sep 17 00:00:00 2001 From: Vanderson Silva Date: Wed, 11 Jul 2012 22:18:22 -0300 Subject: [PATCH] inclusao do método 'createCountQueryString' e remoção do parâmetro 'List predicates' do método findByCriteriaQuery --- impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java | 33 +++++++++++++++++++++++++++------ impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties | 3 ++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java index d17be4e..c3ef904 100644 --- a/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java +++ b/impl/extension/jpa/src/main/java/br/gov/frameworkdemoiselle/template/JPACrud.java @@ -39,6 +39,8 @@ package br.gov.frameworkdemoiselle.template; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.enterprise.inject.Instance; import javax.inject.Inject; @@ -185,10 +187,9 @@ public class JPACrud implements Crud { pagination = getPagination(); TypedQuery listQuery = getEntityManager().createQuery(jpql, getBeanClass()); if (pagination != null) { - int indexFrom = jpql.toUpperCase().indexOf("FROM"); - String countJPQL = "SELECT count(*) " + jpql.substring(indexFrom); - Query query= getEntityManager().createQuery(countJPQL); - Number cResults=(Number) query.getSingleResult(); + String countQueryString = createCountQueryString(jpql); + Query query = getEntityManager().createQuery(countQueryString); + Number cResults = (Number) query.getSingleResult(); pagination.setTotalResults(cResults.intValue()); listQuery.setFirstResult(pagination.getFirstResult()); listQuery.setMaxResults(pagination.getPageSize()); @@ -201,14 +202,14 @@ public class JPACrud implements Crud { * @param criteriaQuery - structure CriteriaQuery * @return a list of entities */ - public List findByCriteriaQuery(CriteriaQuery criteriaQuery, List predicates) { + public List findByCriteriaQuery(CriteriaQuery criteriaQuery) { pagination = getPagination(); TypedQuery listQuery = getEntityManager().createQuery(criteriaQuery); if (pagination != null) { CriteriaBuilder builder = getEntityManager().getCriteriaBuilder(); CriteriaQuery countQuery = builder.createQuery(Long.class); countQuery.select(builder.count(countQuery.from(getBeanClass()))); - countQuery.where(predicates.toArray(new Predicate[] {})); + countQuery.where(criteriaQuery.getRestriction()); getEntityManager().createQuery(countQuery); pagination.setTotalResults((int) (getEntityManager().createQuery(countQuery).getSingleResult() + 0)); listQuery.setFirstResult(pagination.getFirstResult()); @@ -217,6 +218,26 @@ public class JPACrud implements Crud { return listQuery.getResultList(); } + /** + * Converts JPA query to JPA count query + * @param query + * @return + */ + private String createCountQueryString(String query) { + Matcher matcher = Pattern.compile("SELECT(.+)FROM").matcher(query); + if (matcher.find()){ + String group = matcher.group(1).trim(); + query = query.replaceFirst(group, "COUNT(" + group + ")"); + matcher = Pattern.compile("ORDER(.+)").matcher(query); + if (matcher.find()){ + group = matcher.group(1); + query = query.replaceFirst("ORDER"+group, ""); + } + return query; + }else{ + throw new DemoiselleException(bundle.get().getString("malformed-jpql")); + } + } /** * Retrieves the number of persisted objects for the current class type. diff --git a/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties b/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties index 9dde8ee..6aafa68 100644 --- a/impl/extension/jpa/src/main/resources/demoiselle-jpa-bundle.properties +++ b/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 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. persistence-unit-name-found=Unidade de persist\u00EAncia "{0}" encontrada. entity-manager-closed=O gerenciador de entidades foi fechado. -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. \ No newline at end of file +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. +malformed-jpql=Consulta JPQL mal formada para pagina\u00E7\u00E3o de dados. -- libgit2 0.21.2