我只能从表中获取几个列值。所以我使用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
但这也不起作用。因此,有人可以帮助解决如何使代码更好的问题。
由于
哈里什
答案 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)
Projections.property()
将String作为参数。在您提供的代码中,该String的值应该是Bulletin类成员的名称。例如,假设bulletinIdAttr
是具有此类值的String,否则您将遇到运行时错误。当您在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);
}
但这不会对你的结果产生任何影响。您是否检查过rows
是空的?
答案 2 :(得分:3)
如果您想根据相同条件进行第二次搜索,则必须更改或删除投影。例如,如果您首先搜索计数:
criteria.setProjection(Projections.rowCount());
Integer count = criteria.list().get(0);
然后想要获取所有对象:
criteria.setProjection(null);
List<Object> returnedObjects = criteria.list();