Domanda

Beh, come il titolo della domanda dice, io sto cercando di fare un criterio di proiezione interrogazione unica coppia degli attributi della tabella.

Così ho una persona Table / classe e ha circa 40 attributi. Voglio che i miei criteri per ottenere il numero di attributi dinamici, consente di dire 10, 11 o 12 (termini SQL select firstname, lastname from person) e stavo facendo in questo modo:

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;

e dà indietro che gli elementi non sono retList dal Person.class:

  

INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
  FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; non può essere gettato a usergroupmanager.model.db.Person   java.lang.ClassCastException: [Ljava.lang.Object; non può essere gettato a usergroupmanager.model.db.Person

Si prega di aiuto, per ora sto elencando tutti i 40+ attr, e ci vuole il tempo l'interrogazione e non mi piace. Sto cercando anche una soluzione alternativa che aiuterà a risolvere questo. Ho letto di ResultTransformer ma havent trovato come usarlo nel mio caso.

È stato utile?

Soluzione

  

[Ljava.lang.Object; non può essere assegnato a   usergroupmanager.model.db.Person

dice a parole puliti Object[] non può essere gettato a Person. Quando si esegue una proiezione, si otterrà il attributi selezionata come un array di oggetti invece di un'entità idratato.

Il codice manca la dichiarazione di retlist. Credo che sia un List crudo che si esegue il cast a un qualche List<Person>. Basta sostituire quello con List<Object[]>.

Altri suggerimenti

È possibile utilizzare criteria.setResultTransformer ()

C'è un po 'Transformers forniti in Hibernate. Se la persona non ha alcuna associazione utilizzare questo:

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

Ma se persona ha qualunque forma di associazione, prendere in considerazione l'uso Seimos a http://github.com/moesio/seimos

Un sacco di codice potrebbe essere salvato se lo si utilizza invece criteri.

Se si utilizza una proiezione in Hibernate non sta eseguendo la query tutti i dati Hibernate ha bisogno per creare gli oggetti. Così Hibernate non può creare gli oggetti.

In questo modo la query da una proiezione solo restituisce un array di SQL restituita dalla query cioè restituisce un s List e si accede i campi come voci semplici, in tale matrice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top