Hibernate Criteria Projection

10,102

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.

Share:
10,102
Darwly
Author by

Darwly

see homepage

Updated on June 26, 2022

Comments

  • Darwly
    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 the Person.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.Person

    Please 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
    Darwly over 13 years
    thank you, i figured it out eventually but it was frustrating at that time.. Thanks a bunch