Hibernate预测列表

时间:2012-06-15 19:42:41

标签: hibernate criteria projection

我只能从表中获取几个列值。所以我使用Projections来实现这一目标。代码有效,但我认为它没有效果。

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

 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

但这也不起作用。因此,有人可以帮助解决如何使代码更好的问题。

由于

哈里什

3 个答案:

答案 0 :(得分: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)应该具有适当的setter来设置属性的值。

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

答案 1 :(得分:4)

  1. Projections.property()将String作为参数。在您提供的代码中,该String的值应该是Bulletin类成员的名称。例如,假设bulletinIdAttr是具有此类值的String,否则您将遇到运行时错误。
  2. 当您在Criteria实例上调用setProjection时,您隐式将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);
    }
    
  3. 但这不会对你的结果产生任何影响。您是否检查过rows是空的?

答案 2 :(得分:3)

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

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

然后想要获取所有对象:

criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();