Hibernate Criteria Projection
Solution 1
[Ljava.lang.Object; cannot be cast to usergroupmanager.model.db.Person
Says in clean words Object[]
cannot be cast to Person
. When you do a projection, you will get the attributes you selected as an array of objects instead of a hydrated entity.
Your code is missing the declaration of retlist
. I guess it's a raw List
which you cast to a List<Person>
somewhere. Just replace that with List<Object[]>
.
Solution 2
You can use criteria.setResultTransformer()
There's some Transformers provided in Hibernate. If your Person has not any association use this:
criteria.setResultTransformer(Transformers.aliasToBean(Person.class));
But if Person has any association, consider use Seimos at http://github.com/moesio/seimos
A lot of code could be saved if you use it instead Criteria.
Comments
-
Darwly almost 2 years
Well as the question title says, I am trying to make a projection criteria querying only couple of the table attributes.
So I have a Person Table/class and it has about 40 attributes. I want my criteria to get dynamical number of attributes, lets say 10, 11 or 12 (SQL terms
select firstname, lastname from person
) and I was doing it like this: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;
and it gives back that the
retList
elements are not from thePerson.class
:INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object;@14b9b80
FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to usergroupmanager.model.db.Person java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to usergroupmanager.model.db.PersonPlease help, for now I am listing all the 40+ attr, and it takes up querying time and I do not like it. I am looking also an alternative solution which will help me solve this. I read about
ResultTransformer
but havent found how to use it in my case. -
Darwly over 13 yearsthank you, i figured it out eventually but it was frustrating at that time.. Thanks a bunch