Pregunta

Bueno como dice el título de la pregunta, yo estoy tratando de hacer una consulta de criterios de proyección única pareja de los atributos de la tabla.

Así que tengo una tabla Persona / clase y que tiene alrededor de 40 atributos. Quiero que mis criterios para obtener el número de atributos dinámicos, digamos 10, 11 o 12 (SQL términos select firstname, lastname from person) y lo estaba haciendo de esta manera:

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;

y devuelve los elementos que no son retList del Person.class:

  

INFO [AWT-EventQueue-0] (UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
  FATAL [AWT-EventQueue-0] (Login.java78) - java.lang.ClassCastException: [Ljava.lang.Object; No se puede lanzar a usergroupmanager.model.db.Person   java.lang.ClassCastException: [Ljava.lang.Object; No se puede lanzar a usergroupmanager.model.db.Person

Por favor ayuda, por ahora estoy enumerando todo el attr 40+, y se tarda tiempo de consulta y no me gusta. Busco también una solución alternativa que ayudará a resolver esto. He leído acerca de ResultTransformer pero No se han detectado cómo usarlo en mi caso.

¿Fue útil?

Solución

  

[Ljava.lang.Object; No puede ser enviado a   usergroupmanager.model.db.Person

dice en palabras limpias Object[] no se puede convertir a Person. Cuando se hace una proyección, obtendrá los atributos que ha seleccionado como una serie de objetos en lugar de una entidad hidratado.

Su código no se encuentra la declaración de retlist. Creo que es un List prima que lanzas a un List<Person> alguna parte. Basta con sustituir eso con List<Object[]>.

Otros consejos

Puede utilizar criteria.setResultTransformer ()

Hay algunos transformadores previstos en Hibernate. Si el individuo no se utilice cualquier forma de asociación siguiente:

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

Pero si la persona tiene alguna asociación, considere šeimos uso en http://github.com/moesio/seimos

Una gran cantidad de código se podría ahorrar si lo usa en lugar de criterios.

Si utiliza una proyección en Hibernate no está consultando todos los datos Hibernate tiene que crear los objetos. De este modo Hibernate no puede crear los objetos.

Por lo tanto la consulta de una proyección simplemente devuelve una matriz de SQL regresar de la consulta es decir, se devuelve una lista de s y acceder a los campos como entradas de civil en esa matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top