Hibernate Criteria 投影查询

4

正如问题标题所说,我正在尝试制作一个投影条件查询,只查询几个表属性。

因此,我有一个人员表/类,它有大约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
FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to usergroupmanager.model.db.Person java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to usergroupmanager.model.db.Person

请帮忙,目前我正在列出所有40多个属性,这需要查询时间,我不喜欢这种方式。我也在寻找另一种解决方案,可以帮助我解决这个问题。我了解了ResultTransformer,但还没有找到如何在我的情况下使用它。


retList的定义是什么? - mmmmmm
开始时,我用泛型测试了List retList = null;现在使用List<Person> retList = null并且相同的事情。 - Darwly
3个回答

6
你可以使用criteria.setResultTransformer()。
Hibernate提供了一些转换器。如果你的Person没有任何关联,请使用以下代码:
criteria.setResultTransformer(Transformers.aliasToBean(Person.class));

但如果Person有任何关联,请考虑在http://github.com/moesio/seimos使用Seimos。

如果使用Seimos而不是Criteria,可以节省很多代码。


4

[Ljava.lang.Object; 无法转换为 usergroupmanager.model.db.Person

简单来说,Object[] 不能被转换为 Person。当你进行投影时,你会得到选择的属性作为对象数组而不是一个完整的实体。

你的代码缺少对 retlist 的声明。我猜它是一个原始的 List,你在某个地方将其转换为 List<Person>。只需将其替换为 List<Object[]> 即可。


谢谢,我最终解决了,但当时很令人沮丧。非常感谢。 - Darwly

0
如果您在Hibernate中使用投影,那么您并没有查询创建对象所需的所有数据。因此,Hibernate无法创建对象。
因此,从投影查询返回的仅仅是一个SQL查询返回的数组,即它返回一个列表,您可以将其作为该数组中的普通条目访问字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接