Проекция критериев гибернации

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

Итак, у меня есть таблица / класс 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:

ИНФОРМАЦИЯ [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 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам