как выбрать указанные поля и вернуть список объектов (определенных пользователем) - (hibernate) - PullRequest
2 голосов
/ 25 мая 2011

Hibernate api doc представляет классы Criteria и Projection, которые могут помочь выбрать определенные поля таблицы и вернуть список объектов.

НО, я хочу получить список класса А. (A определяется мной), поэтому я могу использовать его как обычный список объектов.

Например, у меня есть класс:

class A {
    String field1;
    String field2;
    String field3;

    String getField1() {
        return field1;
    }
...
}

таблица в базе данных имеет те же поля.

Я хочу выбрать только field1 и field2.поэтому я попытался:

List<A> list = (List<A>) ession.createCriteria(A.class)
                    .setProjection(Projections.projectionList()
                                 .add(Projections.property("field1"))
                                 .add(Projections.property("field1"))
                                 .list();

Это явно не правильно: java.lang.ClassCastException !!

Есть ли способ получить список класса А?Я хочу использовать метод А напрямую, например:

list.get(0).getField1()

thks .......

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Я не уверен, что Hibernate Criteria API позволяет проецировать на объекты произвольного класса, но вы можете проецировать результаты HQL-запроса на объекты произвольного класса, построенного с помощью HQL-запроса, путем «вызова» конструктора в предложении HQL select:

select new Family(mother, mate, offspr)
   from DomesticCat as mother
   join mother.mate as mate
   left join mother.kittens as offspr

См. Предложение select в руководстве по Hibernate, глава HQL: Язык запросов Hibernate.

0 голосов
/ 25 мая 2011

Если вы установите проекцию на критерии, запрос больше не будет возвращать список сущностей, но список массивов скаляров.Это хорошо, так как возвращение частично загруженной сущности может привести к множеству ошибок из-за нарушения инвариантов (ненулевые поля равны нулю, незагруженные ассоциации и т. Д.).

Итак, вам следует использовать другуютип объекта (объекта значения) для представления загруженных полей:

List<Object[]> result = criteria.list();
for (Object[] row : result) {
    AValueObject a = new AValueObject((String) row[0], (String) row[1]);
    // ...
}

Hibernate также может выполнить это преобразование для вас, используя отражение, используя AliasToBeanResultTransformer или AliasToBeanConstructorResultTransformer.

...