Foros del Web » Programación para mayores de 30 ;) » Java »

Duda de Hibernate

Estas en el tema de Duda de Hibernate en el foro de Java en Foros del Web. Hola a todos. Tengo una duda de Projections y espero me puedan ayudar. Estoy usando Criteria y Projections para generar este query: Código: select count(*) ...
  #1 (permalink)  
Antiguo 23/04/2009, 07:40
Avatar de Wayern  
Fecha de Ingreso: septiembre-2008
Ubicación: Aguascalientes
Mensajes: 65
Antigüedad: 15 años, 7 meses
Puntos: 4
Pregunta Duda de Hibernate

Hola a todos. Tengo una duda de Projections y espero me puedan ayudar. Estoy usando Criteria y Projections para generar este query:
Código:
select count(*) as y0,  M.COA_ID as y1
  from T_ACT_MAPPING M
 where M.ACTUAL_MAPPING = 'Y'
   and M.COA_ID in (select C.COA_ID as y0
                          from T_COA C
                         where C.IS_ACTIVE = 'Y')
 group by M.COA_ID
Este es el código que uso en mi DAO:
Código:
Criteria c=getSession().createCriteria(TActMapping.class);
DetachedCriteria dt=
DetachedCriteria.forClass(TCoa.class).setProjection(Property.forName("coaId"))
			.add(Restrictions.eq("isActive", Constants.YES));
				ProjectionList proList = Projections.projectionList();
proList.add(Projections.rowCount());
proList.add(Projections.groupProperty("coaId"));
c.setProjection(proList);
c.add(Restrictions.eq("actualMapping", Constants.YES));
c.add(Property.forName("coaId").in(dt));
objList=(List<Object>)c.list();
El query que me genera es correcto, lo que no se es como obtener el valor del count. Por ejemplo, al ejecutar el query que me da hibernate en la BD este es el resultado:
Código:
Y0  Y1
2	584
3	580
3	581
3	583
3	720
1	585
2	683
2	601
2	644
Mi duda es, si tengo que agregar un campo count al bean o cómo puedo obtener los valores de Y0. Espero haber sido lo suficientemente claro y me puedan ayudar. Un saludo y muchas gracias.
  #2 (permalink)  
Antiguo 24/04/2009, 14:35
Avatar de Wayern  
Fecha de Ingreso: septiembre-2008
Ubicación: Aguascalientes
Mensajes: 65
Antigüedad: 15 años, 7 meses
Puntos: 4
Respuesta: Duda de Hibernate

Hola de nuevo. Encontré la forma de obtener los datos que trae el query, aunque no es la más óptima o al menos no me lo parece. Lo que pasa es que cuando agregamos algún Projection a nuestro Criteria este deja de regresarnos un objeto o lista de objetos del tipo de la entidad, para regresarnos un objeto tipo Object o un List<Object>, lo unico que se me ocurrió hacer fue esto:
Código:
List<Object> objList;
Criteria c=getSession().createCriteria(TActMapping.class);
DetachedCriteria dt=
DetachedCriteria.forClass(TCoa.class).setProjection(Property.forName("coaId"))
			.add(Restrictions.eq("isActive", Constants.YES));
				ProjectionList proList = Projections.projectionList();
proList.add(Projections.rowCount());
proList.add(Projections.groupProperty("coaId"));
c.setProjection(proList);
c.add(Restrictions.eq("actualMapping", Constants.YES));
c.add(Property.forName("coaId").in(dt));
objList=(List<Object>)c.list();

for (int i= 0; i< objList.size(); i++) {
     final Object objs[] = (Object[]) objList.get(i);
     for(int j=0; j<objs.length; j++){
          System.out.println("****"+files[j]);
          //Insertar código
     }
}
Lo que estoy haciendo es obteniendo todos los elementos de la lista y los estoy metiendo en un array de Object, de esta forma podemos utilizarlos en nuestros métodos como mejor nos convenga. Decia que no es una forma muy óptima porque tenemos que saber el orden en que se nos va a regresar el resultado, en este caso, tengo que saber si en el primer elemento del array se va a guardar el valor del rowCount o si se va a guardar un objeto tipo Coa, pero con un poquito de analisis no creo que haya bronca. No cheque que pasabe utilizando un forEach, si alguno lo hace le agradecere me comente que tal le funcionó. Si alguien tiene una duda similar, espero le sirva este método. Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:51.