Har*_*rry 5 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;
Run Code Online (Sandbox Code Playgroud)
我只需要将criteria.list设置为BulletinList(包含Bulletin对象列表的类).但是当我使用投影时,Bulletin对象为null.
我也在阅读另一个使用的线程
setResultTransformer(Transformers.aliasToBean
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.所以有人可以帮助解决如何使代码更好的问题.
谢谢
哈里什
您可以使用
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();
Run Code Online (Sandbox Code Playgroud)
这里的criteria.setResultTransformer(新的AliasToBeanResultTransformer(Bulletin.class))将在所需的POJO类中转换您的结果,但要确保您的POJO类(在您的情况下为Bulletin.class)应该具有适当的setter来设置属性的值.
现在,criteria.list()将返回Bulletin POJO类的List而不是Object.
Projections.property()接受一个字符串作为参数。在您提供的代码中,该字符串的值应该是 Bulletin 类成员的名称。bulletinIdAttr例如,大概是一个具有这样值的字符串,否则您将收到运行时错误。当您调用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);
}
Run Code Online (Sandbox Code Playgroud)但这不会对您的结果产生任何影响。你检查过它rows是空的吗?
| 归档时间: |
|
| 查看次数: |
23325 次 |
| 最近记录: |