2010-10-07 47 views
4

我必須在合適的表格格式中將員工和他的項目顯示在員工的下拉列表中。在頂部,我需要顯示記錄數。因此,我正在做兩個查詢,一個用於檢索計數,另一個用於檢索員工和他的項目。最後,總計數來到員工*項目計數。如何在hibernate中檢索不同的根實體行數?

如果員工有3個項目,那麼它計爲3.但我只需要員工數。而且我正在重新獲取明確的Employee對象,該僱員對象的列表爲Project

我用.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)得到這樣的結果。

請幫我只得到員工數的代替員工*項目,我這個苦苦掙扎。

我的代碼是,

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; 
    } 

這些是我使用的方法。

回答

1

Hibernate在進行連接並嘗試計數時存在一個問題。 DISTINCT_ROOT_ENTITY的問題在於它刪除了相同的行,但由於您進行了連接,因此某些行具有不同的字段,儘管它們是相同的實體。

如果您想統計並同時進行連接,請將檢索到的所有對象放入Set。這樣重複將消失。然後你可以做Set#size來計算。您可以使用HQL並手動編寫您的查詢。

也許如果你編輯你的問題並添加你正在創建的實際查詢,我們可以幫助你進一步。

更新

後補充一點:List lst = criteria.list();

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

嗨了,謝謝添加我的代碼。請幫忙。 – Jothi 2010-10-07 14:29:57

+0

嗨,我能夠得到不同的根實體。我的問題是什麼如果我指定沒有記錄爲10,如果第一個員工有10個項目關聯,只有第一人列出沒有任何other.I需要回收10員工。 – Jothi 2010-10-11 11:17:28

+0

我很抱歉,但我不明白你說什麼。你的問題是你只收到10行?在這種情況下,您可以嘗試使用'Criteria#setMaxResults(Integer.MAX_VALUE)',但我建議您將數據的檢索拆分爲更多的X行查詢。否則,您可能會遇到'PermGem'或'OutOfMemory'異常 – pakore 2010-10-11 12:42:02

相關問題