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
You can use
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();
Here criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class)) will transform your result in the desired POJO class but make sure your POJO class( Bulletin.class in your case) should have appropriate setters to set the values of properties.
Now criteria.list() will return the List of Bulletin POJO class instead of Object.
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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With