Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate Projections List

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

like image 238
Harry Avatar asked Jun 15 '12 19:06

Harry


2 Answers

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.

like image 159
Shiva Agrawal Avatar answered Sep 30 '22 12:09

Shiva Agrawal


  1. 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.
  2. 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?

like image 41
carbontax Avatar answered Sep 30 '22 12:09

carbontax