Проекция критериев гибернации - PullRequest
3 голосов
/ 11 сентября 2010

Как следует из заголовка вопроса, я пытаюсь составить критерий проекции, запрашивая только пару атрибутов таблицы.

Итак, у меня есть таблица / класс Person, и она имеет около 40 атрибутов. Я хочу, чтобы мои критерии получали динамическое число атрибутов, скажем, 10, 11 или 12 (термины SQL select firstname, lastname from person), и я делал это так:

Transaction tx = session.beginTransaction();
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
Criterias c = null;
 for (int i = 0; i < checked.size(); i++) {
        Attribute attr = checked.elementAt(i);
        switch (attr) {
            case LASTNAME:
                projList.add(Projections.property("lastName"));
                c = enumMap.get(attr);
                if (c.isChanged()) {
                    String tmp = (String) c.getAnswer();
                    tmp = tmp.replace('*', '%');
                    crit.add(Restrictions.like("lastName", tmp));
                    crit.addOrder(Order.asc("lastName"));
                }
            case ...THE REST .....
            }
    crit.setProjection(projList);
    retList = crit.list();
    tx.commit();
    return retList;

и это возвращает, что retList элементы не из Person.class:

INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; не может быть приведен к usergroupmanager.model.db.Person java.lang.ClassCastException: [Ljava.lang.Object; не может быть приведен к usergroupmanager.model.db.Person

Пожалуйста, помогите, сейчас я перечисляю все 40+ атрибутов, и это занимает время запроса, и мне это не нравится. Я также ищу альтернативное решение, которое поможет мне решить эту проблему. Я прочитал о ResultTransformer, но не нашел, как использовать его в моем случае.

Ответы [ 3 ]

5 голосов
/ 08 августа 2012

Вы можете использовать crit.setResultTransformer ()

В Hibernate есть несколько Трансформеров.Если у вашего Лица нет какой-либо ассоциации, используйте это:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class));

Но если у Лица есть какая-либо ассоциация, рассмотрите возможность использования Seimos на http://github.com/moesio/seimos

Если вы используете его, можно сохранить много кодавместо Критерии.

4 голосов
/ 11 сентября 2010

[Ljava.lang.Object; не может быть приведен к usergroupmanager.model.db.Person

Говорит чистыми словами Object[] нельзя привести к Person. Когда вы делаете проекцию, вы получите выбранные атрибуты в виде массива объектов вместо гидратированного объекта.

В вашем коде отсутствует объявление retlist. Я предполагаю, что это необработанный List, который вы разыгрываете где-то в List<Person> Просто замените это на List<Object[]>.

0 голосов
/ 11 сентября 2010

Если вы используете проекцию в Hibernate, вы не запрашиваете все данные, необходимые Hibernate для создания объектов. Таким образом, Hibernate не может создавать объекты.

Таким образом, запрос из проекции просто возвращает массив SQL, возвращенный из запроса, т.е. он возвращает список s, и вы получаете доступ к полям как к простым записям в этом массиве.

...