6

我只需要从表中获取几个列值。所以我使用 Projections 来实现这一点。该代码有效,但我认为它无效。

我的问题是当我使用 ProjectionsList 然后将 criteria.list 设置为 ArrayList - Bulletin 对象为空。我不确定如何更好地解释这一点。所以我会放代码,然后请阅读以下内容:

 List<Bulletin> list = new ArrayList<Bulletin>();
 BulletinList bulletinList = null;

 Criteria criteria = null;

 criteria = this.getSession().createCriteria(Bulletin.class)
            .setProjection(Projections.projectionList()
            .add(Projections.property(bulletinIdAttr))
            .add(Projections.property(docNameAttr))   
            .add(Projections.property(docTypeCodeAttr))
            );        
    criteria.addOrder(Order.desc(createdTimeAttr));

    List<Object> rows = criteria.list();
    for (Object r : rows) {
        Object[] row = (Object[]) r;
        Bulletin bull = new Bulletin();
        bull.setBulletinId((Long) row[0]);
        bull.setDocumentName((String) row[1]);
        bull.setDocumentTypeCode((String) row[2]);
        list.add(bull);
      }

    bulletinList = new BulletinList();
    bulletinList.setBulletins(list);

    return bulletinList;

我只需要将 criteria.list 设置为 BulletinList(包含 Bulletin 对象列表的类)。但是当我使用投影时,Bulletin 对象为空。

我也在阅读另一个线程来使用

setResultTransformer(Transformers.aliasToBean

但这也行不通。那么有人可以帮助解决如何使代码更好的问题。

谢谢

哈里什

4

3 回答 3

8

您可以使用

 criteria = this.getSession().createCriteria(Bulletin.class)
            .setProjection(Projections.projectionList()
            .add(Projections.property(bulletinIdAttr),"bulletinIdAttr")
            .add(Projections.property(docNameAttr),"docNameAttr")   
            .add(Projections.property(docTypeCodeAttr),"docTypeCodeAttr")
            );        
criteria.addOrder(Order.desc(createdTimeAttr));
criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class));
List<Bulletin> bulletinList = criteria.list();

在这里,criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class)) 会将您的结果转换为所需的 POJO 类,但请确保您的 POJO 类(在您的情况下为 Bulletin.class)应该具有适当的设置器来设置属性值。

现在,criteria.list() 将返回 Bulletin POJO 类的列表而不是 Object。

于 2014-04-07T12:51:13.750 回答
5
  1. Projections.property()接受一个字符串作为参数。在您提供的代码中,该字符串的值应该是 Bulletin 类成员的名称。例如,大概bulletinIdAttr是一个具有这样一个值的字符串,否则你会得到运行时错误。
  2. 当您调用setProjectionCriteria 实例时,您隐式地将 ResultTransformer 设置为PROJECTIONS,这就是您想要的。没必要给setResultTransformer自己打电话。我会像这样简化例程

    List<Object[]> rows = criteria.list();
    for (Object[] row : rows) {
       Bulletin bull = new Bulletin();
       bull.setBulletinId((Long) row[0]);
       bull.setDocumentName((String) row[1]);
       bull.setDocumentTypeCode((String) row[2]);
       list.add(bull);
    }
    

但这不应该对您的结果产生任何影响。你检查过它rows是空的吗?

于 2012-06-16T16:56:35.723 回答
3

如果您想从相同的条件进行第二次搜索,您必须更改或删除投影。例如,如果您先搜索计数:

criteria.setProjection(Projections.rowCount());
Integer count = criteria.list().get(0);

然后想要获取所有对象:

criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();
于 2016-03-23T16:17:33.973 回答