I ned to get only a few column values from the table. So I have used Projections to achieve this. The code works, but I don't think it is effective.
My issue was when I used ProjectionsList & then set the criteria.list to an ArrayList - the Bulletin object is null. I'm not sure how to explain this better. So I will put the code and then please read below:
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;
I just need to set criteria.list to BulletinList (Class that holds a list of Bulletin objects). But when I use projections, Bulletin object is null.
I also was reading another thread to use
setResultTransformer(Transformers.aliasToBean
But that ain't working either. So can someone help in this on how to make the code better.
Thanks
Harish
Projections.property()
takes a String as an argument. In the code you provided the value of that String should be the name of a member of the Bulletin class. Presumably bulletinIdAttr
, for example, is a String with such a value otherwise you would be getting runtime errors.When you call setProjection
on a Criteria instance you are implicitly setting the ResultTransformer to PROJECTIONS
and this is what you want. No need to call setResultTransformer
yourself. I would simplify the routine a little like this
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);
}
But that shouldn't make any difference to your results. Have you checked that rows
is empty?