java - seleccione "todas las columnas" con "agrupar por" en consultas de criterios de hibernaciĆ³n
hql order by date (3)
Quiero escribir una consulta de criterios usando "agrupar por" y quiero devolver todas las columnas.
Plano sql es así:
select * from Tab group by client_name order by creation_time;
Entiendo que tendrá número de filas count(distinct client_name)
.
Mi consulta actual que no parece dar el resultado correcto es la siguiente:
Criteria criteria = getSession(requestType).createCriteria(Tab.class);
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name")));
criteria.addOrder(Order.asc("creationTime"));
Esta consulta devuelve "client_name"
solamente. No quiero poner todos los nombres de columna manualmente. Debe haber alguna manera, ¿qué se puede hacer?
Al usar la proyección de hibernación, debe agregar todas las columnas que se necesitan en la lista de proyección. solo has usado Projections.projectionList (). add (Projections.groupProperty ("client_name"))
esta . así que está claro que solo devuelva client_name.
Creo que estás malinterpretando algo. Si GROUP BY
en SQL, entonces necesitas agrupar por todas las columnas seleccionadas. Lo mismo se aplica a Hibernate: si groupProperty
en una Projection
, le está diciendo a Hibernate que esa columna es una columna de grupo. Si no se hace referencia a otras columnas / campos, Hibernate asumirá que no los quiere, ya que también necesitarían estar agrupados.
Dar un paso atrás: ¿qué estás tratando de hacer? Si tiene datos duplicados en todas las columnas de una tabla, es posible que tenga datos incorrectos o datos persistentes incorrectos. Por lo menos, tu llave estaría en mal estado.
En hibernación para proyecciones, todas las columnas requeridas deben agregarse a la lista de proyección. Para obtener el resultado en la entidad, tenemos que usar setResultTransformer. Verifique el ejemplo siguiente para obtener el grupo by in hibernate:
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("column1"));
projectionList.add(Projections.property("column2"));
projectionList.add(Projections.property("column3"));
criteria.setProjection(projectionList);
criteria.setResultTransformer(Transformers.aliasToBean(Table.class));