正如标题所述的问题,我正在尝试制作一个投影标准,仅查询几个表格属性。

因此,我有一个人表/班级,它有大约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:

信息[awt-esventqueue-0](UserGroupManagerApp.java127) - [ljava.lang.object;@14B9B80
致命[awt-esventqueue-0](login.java78)-java.lang.classcastException:[ljava.lang.object;不能施放到UserGroupManager.model.db.person Java.lang.classcastException:[ljava.lang.object;不能施放到UserGroupManager.model.db.person

请帮助,现在我列出了所有40+ atter,它会占用查询时间,但我不喜欢它。我也正在寻找一种替代解决方案,可以帮助我解决这个问题。我读了 ResultTransformer 但是在我的情况下,还没有找到如何使用它。

有帮助吗?

解决方案

ljava.lang.Object;不能施放到UserGroupManager.model.db.person

用简洁的话说 Object[] 不能施放 Person. 。当您进行投影时,您将获得选择作为对象数组而不是水合实体的属性。

您的代码缺少声明 retlist. 。我想这是原始的 List 你把它扔给 List<Person> 某处。只是用 List<Object[]>.

其他提示

您可以使用criteria.setResulttransFormer()

冬眠中提供了一些变压器。如果您的人没有任何关联使用此信息:

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

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

如果您使用标准,则可以保存很多代码。

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

因此,投影的查询只会返回从查询IE返回的SQL的数组,即返回为列表,您可以将字段访问该数组中的普通条目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top