Вопрос

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

Поэтому у меня есть личный стол / класс, и у него около 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+ attr, и это занимает время запроса, и мне это не нравится. Я ищу также альтернативное решение, которое поможет мне решить это. Я прочитал о ResultTransformer Но не нашел, как использовать его в моем случае.

Это было полезно?

Решение

Ljava.lang.Object; не может быть выброшено для usergroupmanager.model.db.person

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

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

Другие советы

Вы можете использовать критерии .setresulttransformer ()

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top