Question

Bien que le titre de la question dit, je suis en train de faire un critère de projection interrogation seulement deux des attributs de table.

J'ai une personne table / classe et il a environ 40 attributs. Je veux que mes critères pour obtenir le nombre d'attributs dynamique, disons 10, 11 ou 12 (termes SQL select firstname, lastname from person) et je le faisais comme ceci:

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 éléments de retList ne sont pas du 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 jeté à 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 du temps et je l'interrogation ne l'aime pas. Je cherche également une solution de rechange qui me aider à résoudre cela. Je l'ai lu ResultTransformer mais havent trouvé comment l'utiliser dans mon cas.

Était-ce utile?

La solution

  

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

dit en Object[] mots propres ne peut être jeté à Person. Lorsque vous faites une projection, vous obtiendrez les attributs que vous avez sélectionné comme un tableau d'objets au lieu d'une entité hydratée.

Votre code manque la déclaration de retlist. Je suppose que c'est une List cru que vous lancez à un endroit de List<Person>. Il suffit de le remplacer par List<Object[]>.

Autres conseils

Vous pouvez utiliser criteria.setResultTransformer ()

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

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.

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

Ainsi, la requête d'une projection retourne juste un tableau de SQL renvoyé de la requête par exemple retourne une liste s et vous accédez aux champs comme entrées simples dans ce tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top