2012-01-06 80 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) { 
... 
相关问题