Проекция критериев гибернации
-
02-10-2019 - |
Вопрос
Что ж, как титул вопроса говорит, я пытаюсь сделать критерии проектирования, запрошенные только пару атрибутов таблицы.
Поэтому у меня есть личный стол / класс, и у него около 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, возвращаемый из запроса, т. Е. Он возвращает в качестве списка, и вы получаете доступ к полям в виде простых записей в этом массиве.