2010-09-11 127 views
3

那么问题标题说,我试图做一个投影标准只查询表的几个属性。休眠标准投影

所以我有一个Person Table /类,它有大约40个属性。我希望我的标准来获得属性的动态数量,可以说,10,11或12(SQL方面select firstname, lastname from person),我在做这样的:

Transaction tx = session.beginTransaction(); 
Criteria crit = session.createCriteria(Person.class); 
crit.setCacheable(true); 
ProjectionList projList = Projections.projectionList(); 
projList.add(Projections.property("id")); 
Criterias c = null; 
for (int i = 0; i < checked.size(); i++) { 
     Attribute attr = checked.elementAt(i); 
     switch (attr) { 
      case LASTNAME: 
       projList.add(Projections.property("lastName")); 
       c = enumMap.get(attr); 
       if (c.isChanged()) { 
        String tmp = (String) c.getAnswer(); 
        tmp = tmp.replace('*', '%'); 
        crit.add(Restrictions.like("lastName", tmp)); 
        crit.addOrder(Order.asc("lastName")); 
       } 
      case ...THE REST ..... 
      } 
    crit.setProjection(projList); 
    retList = crit.list(); 
    tx.commit(); 
    return retList; 

而且还给了retList元素不是从Person.class

INFO [AWT-EventQueue的-0](UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
致命[AWT-EventQueue的-0](Login.java78) - java.lang中.ClassCastException:[Ljava.lang.Object;无法转换为usergroupmanager.model.db.Person java.lang.ClassCastException:[Ljava.lang.Object;不能投到usergroupmanager.model.db.Person

请帮忙,现在我列出所有40+ attr,它占用了查询时间,我不喜欢它。我正在寻找替代解决方案,这将帮助我解决这个问题。我读了约ResultTransformer,但没有找到如何使用它在我的情况。

+0

什么是retList的定义 – Mark 2010-09-11 13:29:30

+0

List retList = null;在开始时,我测试了它与泛型现在列表 retList = null和相同的东西 – Darwly 2010-09-11 13:33:44

回答

4

[Ljava.lang.Object;不能转换为 usergroupmanager.model.db.Person

说,在Object[]不能转换到Person干净的话。当你做一个投影时,你会得到你选择的属性作为一个对象数组,而不是水合实体。

您的代码缺少retlist的声明。我想这是一个原始的List,你在某个地方投了一个List<Person>。只需用List<Object[]>替换即可。

+0

谢谢你,我最终想出来,但它在那个时候令人沮丧..谢谢一堆 – Darwly 2010-09-11 23:50:13

0

如果您在Hibernate中使用投影,则不会查询Hibernate创建对象所需的所有数据。因此Hibernate不能创建这些对象。

因此,来自投影的查询只返回查询返回的SQL数组,即它返回一个s List,并且您可以在该数组中以普通条目的形式访问这些字段。

5

您可以使用criteria.setResultTransformer()

有在Hibernate中提供了一些变形金刚。如果你的人没有任何关联使用:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class)); 

但是,如果人有任何关联,在http://github.com/moesio/seimos

,如果你用它来代替标准大量的代码可以被挽救考虑使用Seimos。

+0

它适用于我。谢谢! – sura2k 2013-03-13 09:39:32