Search code examples
hibernatecriteriaprojection

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


Solution

    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?