2012-06-15 1 views
4

Я получил только несколько значений столбца из таблицы. Поэтому я использовал Projections для достижения этого. Код работает, но я не думаю, что он эффективен.Список проекций спящего режима

Моя проблема была в том, что я использовал ProjectionsList &, а затем установил критерий.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; 

мне просто нужно установить criteria.list в BulletinList (класс, который содержит список объектов Bulletin). Но когда я использую проекции, объект Bulletin имеет значение null.

Я также читал другой поток, чтобы использовать

setResultTransformer(Transformers.aliasToBean 

Но это не работает, либо. Так может кто-то помочь в этом, как сделать код лучше.

Благодаря

Хариш

ответ

5
  1. Projections.property() принимает строку в качестве аргумента. В коде, который вы указали, значение этой строки должно быть именем члена класса Bulletin. Предположительно, bulletinIdAttr, например, является строкой с таким значением, иначе вы будете получать ошибки во время выполнения.
  2. Когда вы вызываете setProjection на экземпляр Criteria, вы неявно устанавливаете 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); 
    } 
    

Но это не должно иметь никакого значения для результатов. Вы проверили, что rows пуст?

+0

Большое спасибо за Ваш ответ. Как я уже сказал, мой код выше работает так, как ожидалось, но просто хотел узнать, эффективен ли он. И да, Projections.property() принимает аргумент String. Когда я попытался использовать ваш блок кода, я получаю эту ошибку: – Harry

+0

Тип несоответствия: невозможно преобразовать из типа элемента Object в Object [] в строке для (Object [] row: rows). Что мне здесь не хватает? Пожалуйста, сообщите об этом. – Harry

+0

Извините Хариш, мой первоначальный ответ был отформатирован неправильно, что сделало объявление строк неправильным. Он должен работать так, как сейчас. – carbontax

6

Вы можете использовать

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(); 

Здесь criteria.setResultTransformer (новый AliasToBeanResultTransformer (Bulletin.class)) превратят ваш результат в желаемом классе POJO, но убедитесь, что класс вашего POJO (Bulletin.class в вашем случае) должны иметь соответствующие сеттеры для установки значений свойств.

Теперь критерий.list() вернет класс POJO бюллетеня вместо Object.

+0

В этом проекте больше нет. Но большое спасибо за ваши усилия, хотя это старая нить. – Harry

+0

эта проблема застряла на моем пути много дней, я не могу получить все сведения о свойствах с помощью Projections.projectionList(), но теперь я выполнил свой проект, использованный таким образом, действительно спасибо sir @Shiva Agrawal –

3

Если вы хотите выполнить второй поиск по тем же критериям, вам необходимо изменить или удалить проекцию. Например, если вы ищете для подсчета первого:

criteria.setProjection(Projections.rowCount()); 
Integer count = criteria.list().get(0); 

и затем хотите получать все объекты:

criteria.setProjection(null); 
List<Object> returnedObjects = criteria.list();