Проекция критериев гибернации
Как следует из заголовка вопроса, я пытаюсь составить критерий проекции, запрашивая только пару атрибутов таблицы.
Итак, у меня есть таблица / класс 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, и вы получаете доступ к полям как к простым записям в этом массиве.