2010-10-07 2 views
4

Je dois montrer Employee et son projet dans la liste déroulante à l'employé dans le bon trajet du format tabulaire. En haut, je dois montrer le nombre d'enregistrements. Donc, je fais deux requêtes, une pour récupérer le compte et un autre pour récupérer l'employé et son projet.enfin, le compte le nombre total vient employé * projet compte.comment récupérer le nombre distinct de lignes d'entité racine dans Hibernate?

Si un employé a 3 projets alors il compte 3. Mais je n'ai besoin que du nombre d'employés. Et je retrivais objet Employee distinct, cet objet employé a la liste de Project. J'ai utilisé .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) pour obtenir ceci.

S'il vous plaît aidez-moi à obtenir que employé compte au lieu de employé * projet, je me bats avec cela.

Mon code est,

public Collection fetchEmployeeWithProject(final List condition, 
      final PaginationCriteria pageCriteria) 
      throws DataAccessLayerException { 
       Session session = this.getPersManager().getCurrentSession(); 

     Criteria criteria = session.createCriteria(Employee.class, "employee") 
       .createAlias(
         "employee.empProject", "empProject", 
         CriteriaSpecification.LEFT_JOIN).createAlias(
         "empProject.Project", "project", 
         CriteriaSpecification.LEFT_JOIN); 
     criteria = this.addMultipleSeachCriteria(criteria, condition); 
     this.buildPaginatedCriteria(criteria, pageCriteria); 
     List lst = criteria.list(); 
     session.clear(); 
    return lst; 
    } 

protected Criteria buildPaginatedCriteria(Criteria criteria, 
      PaginationCriteria pageCriteria) throws DataAccessLayerException { 

     logger.debug(LOG_PREFIX + "buildPaginatedCriteria::Begin"); 

     if (pageCriteria != null) { 

      if (!pageCriteria.isFetchAll()) { 

       if (pageCriteria.getTotalRecords() == 0) 
        pageCriteria.setTotalRecords(((Integer) criteria 
          .setProjection(Projections.rowCount()) 
          .uniqueResult()).intValue()); 
       criteria.setProjection(null); 
       criteria.setFirstResult(
         pageCriteria.getFirstRecordOfCurrentPage()) 
         .setMaxResults(pageCriteria.getRecordsPerPage()); 
      } 

      if (StringUtils.isNotBlank(pageCriteria.getSortBy())) 
       criteria.addOrder(pageCriteria.isSortDescending() ? Order 
         .desc(pageCriteria.getSortBy()) : Order 
         .asc(pageCriteria.getSortBy())); 

      if (StringUtils.isNotBlank(pageCriteria.getSecondarySortBy())) { 
       criteria.addOrder(Order.asc(pageCriteria.getSecondarySortBy())); 
      } 

      if (pageCriteria.isCached()) { 
       criteria.setCacheable(true).setCacheMode(CacheMode.NORMAL); 
      } 
     } 
     criteria 
       .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

     logger.debug(LOG_PREFIX + "buildPaginatedCriteria::End"); 

     return criteria; 
    } 

Ce sont les méthodes que j'utilise.

Répondre

1

Il y a un problème dans Hibernate lorsque vous faites des jointures et que vous essayez de compter. Le problème avec DISTINCT_ROOT_ENTITY est qu'il supprime des lignes égales, mais puisque vous avez fait une jointure, certaines lignes ont des champs différents bien que ce soit la même entité.

Si vous souhaitez compter et faire des jointures en même temps, placez tous les objets récupérés dans un Set. De cette façon, les doublons disparaîtront. Ensuite, vous pouvez faire Set#size pour compter. Vous pouvez également utiliser HQL et écrire votre requête manuellement. Peut-être que si vous éditez votre question et ajoutez les requêtes réelles que vous créez, nous pourrons vous aider plus avant.

Mise à jour

Ajouter ce après: List lst = criteria.list();

Set<Employee> employeeSet = new HashSet<Employee>(); 
employeeSet.addAll(lst); 
return employeeSet; 
+0

Salut, Thanks.I ont ajouté mon code. S'il vous plaît aider à ce sujet. – Jothi

+0

Salut, je suis capable d'obtenir des entités racines distinctes.Quel est mon problème Si je ne spécifie pas d'enregistrements comme 10, si le premier employé a 10 projets associés, seule la première personne est répertoriée pas autre.J'ai besoin de retriver 10 Employé. – Jothi

+0

Je suis désolé mais je ne comprends pas ce que vous dites. Votre problème est que vous ne recevez que 10 lignes? Dans ce cas, vous pouvez essayer avec 'Criteria # setMaxResults (Integer.MAX_VALUE)', mais je vous recommande de diviser la récupération des données en plusieurs requêtes de X lignes chacune. Sinon, vous pouvez subir une exception «PermGem» ou «OutOfMemory» – pakore

Questions connexes