2010-09-11 4 views
3

Comme le dit le titre de la question, j'essaie de faire un critère de projection ne demandant que quelques-uns des attributs de la table. Donc, j'ai une table/classe de personne et il a environ 40 attributs. Je veux que mes critères pour obtenir le nombre dynamique d'attributs, disons 10, 11 ou 12 (termes SQL select firstname, lastname from person) et je faisais comme ceci:Hibernate Criteria Projection

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; 

et il Redonne que les retList éléments ne sont pas de la Person.class:

INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
FATAL [AWT-EventQueue-0] (Login.java78) - java.lang .ClassCastException: [Ljava.lang.Object; ne peut pas être converti en usergroupmanager.model.db.Person java.lang.ClassCastException: [Ljava.lang.Object; ne peut pas être jeté à usergroupmanager.model.db.Person

S'il vous plaît aider, pour l'instant je suis en répertoriant tous les attr de plus de 40, et il prend le temps et l'interrogation que je ne l'aime pas. Je cherche aussi une solution alternative qui m'aidera à résoudre ce problème. J'ai lu environ ResultTransformer mais je n'ai pas trouvé comment l'utiliser dans mon cas.

+0

Quelle est la définition de retList – Mark

+0

Liste retList = null; au début, je l'ai testé avec des génériques maintenant Liste retList = nul et même chose – Darwly

Répondre

4

[Ljava.lang.Object; ne peut pas être jeté à usergroupmanager.model.db.Person

dit en mots propres Object[] ne peut pas être à Person coulés. Lorsque vous effectuez une projection, vous obtenez les attributs que vous avez sélectionnés en tant que tableau d'objets au lieu d'une entité hydratée.

La déclaration de retlist est manquante dans votre code. Je suppose que c'est un List brut que vous lancez vers un List<Person> quelque part. Il suffit de remplacer cela par List<Object[]>.

+0

merci, je l'ai compris finalement, mais il était frustrant à ce moment-là .. Merci un tas – Darwly

0

Si vous utilisez une projection dans Hibernate, vous n'interrogez pas toutes les données dont Hibernate a besoin pour créer les objets. Ainsi, Hibernate ne peut pas créer les objets.

Ainsi, la requête d'une projection renvoie simplement un tableau du SQL renvoyé par la requête, c'est-à-dire qu'elle retourne une liste et que vous accédez aux champs en tant qu'entrées simples dans ce tableau.

5

Vous pouvez utiliser criteria.setResultTransformer()

Il y a quelques transformateurs fournis dans Hibernate. Si votre personne n'a pas une association utiliser:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class)); 

Mais si la personne a une association, pensez à utiliser šeimos à http://github.com/moesio/seimos

Beaucoup de code pourrait être sauvé si vous l'utilisez au lieu de critères.

+0

Cela fonctionne pour moi. Merci! – sura2k

Questions connexes