简体   繁体   中英

Hibernate Criteria Projection

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.

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.

[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[]> .

If you use a projection in Hibernate you are not querying all the data Hibernate needs to create the objects. Thus Hibernate cannot create the objects.

Thus the query from a projection just returns an array of the SQL returned from the query ie it returns as List and you access the fields as plain entries in that array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM