Cómo devolver una entidad con columnas elegidas utilizando Criterios


Soy realmente nuevo con Hibernate. Quiero un List<User> usando criterios de hibernación, pero solo con los campos id de usuario y nombre rellenados. Es eso posible? Algo así como la consulta que se muestra a continuación:

SELECT user.id, user.name FROM user

Saludos.

Author: Dominic Rodger, 2009-06-04

3 answers

Para esto son exactamente las proyecciones. He aquí un ejemplo:

  Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

  List<User> list = cr.list();

De hecho, si nos fijamos en la documentación de "lazy property fetching" dicen específicamente:


"Un diferente (mejor?) la forma de evitar lecturas innecesarias de columnas, al menos para transacciones de solo lectura, es usar las características de proyección de HQL o consultas de Criterios. Esto evita la necesidad de procesamiento de código de bytes en tiempo de compilación y es sin duda una solución preferida."


Por cierto, hay un pregunta relacionada que también le puede interesar: Consulta de Hibernación Por Ejemplo y Proyecciones

 53
Author: Matt Solnit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:24

Llego muy tarde a responder esto, pero, puede agregar un transformador de resultados personalizado al objeto de consulta como se muestra a continuación.

Query query = session
        .getNamedQuery(
                "someNamedQueryWhichISHQL")
        .setString("cod", "10")
        .setResultTransformer(new ResultTransformer() {

            public Object transformTuple(Object[] row, String[] arg1) {
                User usr = new User(row[0],row[1]);
                return usr
            }

            public List transformList(List arg0) {

                return arg0;
            }
        });
return query.list();
 3
Author: Zeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-10 19:58:27

Normalmente no desea cargar parcialmente las propiedades de un objeto. Pero si es necesario, vea esto:

Http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/performance.html#performance-fetching-lazyproperties

Para un comportamiento similar a un informe simple, puede usar consultas de entidad:

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

Http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/querysql.html#d0e17633

 1
Author: ottodidakt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-25 13:21:56