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

信息 [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但还没有找到如何在我的情况下使用它。

4

3 回答 3

6

您可以使用 criteria.setResultTransformer()

Hibernate 中提供了一些 Transformer。如果您的 Person 没有任何关联,请使用:

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

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

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

于 2012-08-08T05:08:51.187 回答
4

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

言简意赅的说不上Object[]Person。当您进行投影时,您将获得作为对象数组而不是水合实体选择的属性。

您的代码缺少retlist. List我猜这是你投到某个地方的原始文件List<Person>。只需将其替换为List<Object[]>.

于 2010-09-11T15:09:05.727 回答
0

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

因此,来自投影的查询只返回从查询返回的 SQL 数组,即它以 List 形式返回,您可以将字段作为该数组中的普通条目访问。

于 2010-09-11T15:46:14.740 回答