2012-01-06 58 views
2

爲什麼session.createCriteria(classtype).list()返回更多的對象比列表中的爲什麼session.createCriteria(classtype).list()比列表返回更多的對象?

返回列表包含以隨機順序重複的對象。

public Collection getAll() { 
     List list = null; 
     Session session = null; 
     Transaction tx = null; 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      tx = session.beginTransaction(); 
      list = session.createCriteria(getClassType()).list(); 
      tx.commit(); 
     } catch (HibernateException ex) { 
      if (tx != null) { 
       tx.rollback(); 
      } 
      LOGGER.error("HibernateException in getAll"); 
     } finally { 
      if (session != null && session.isOpen()) { 
       session.close(); 
      } 
     } 
     return list; 
    } 
+0

在這種情況下,我怎麼能申請setMaxResults()以標準?然後我添加setMaxResults(10000),我只接近1200個不同的記錄。 – 2012-01-11 07:45:17

回答

2

我假設你的session.createCriteria(classtype).list()調用正在多次返回這個類的一些對象。

當您急切地獲取OneToManyManyToMany關係時會發生這種情況。

正如JB Nizet正確指出的那樣,解決此問題的一種方法是使用Criteria.DISTINCT_ROOT_ENTITYResultTransformer

但是,這將在'java side'完成工作:所有對象將從數據庫中獲取,然後刪除所有重複項。

OneToManyManyToMany延遲(這是默認值)而不是渴望會好得多。

2

這可能是因爲加載的實體有一個toMany關聯,它是使用連接熱切地獲取的。使用獨特的根實體結果轉換到列表中只得到每根實體一次:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

或返回一組,而不是一個列表,如果順序並不重要。

1

感謝您的幫助,我用它,並解決問題是這樣的:

... 
try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      tx = session.beginTransaction(); 
      Criteria criteria = session.createCriteria(getClassType()) 
       .setProjection(Projections.id()) 
       .setFirstResult(getStart()) 
       .setMaxResults(getLength());  
      HashSet<Long> ids = new HashSet(criteria.list());    

      criteria = session.createCriteria(getClassType()) 
       .add(Restrictions.in(ID_COLUMN_NAME, ids)) 
      TreeSet<Employee> items = new TreeSet(criteria.list()); 

      list = new ArrayList<Employee>(items); 

      tx.commit(); 
     } catch (HibernateException ex) { 
... 
相關問題