2010-03-03 15 views
5

Tengo un Criterios con:Quitar dinámicamente un ordenamiento de los resultados en los org.hibernate.Criteria

Sin embargo, cuando quiero obtener el recuento de filas falte;

criteria.setProjection(Projections.rowCount()); 

porque hay es un orden por en la consulta.

¿Cómo eliminar dinámicamente el orden en los Criterios?

Quiero decir, estoy buscando criteria.removeOrder("ID").

+0

Hmm ... ¿por qué llamas 'addOrder()' si no lo deseas? –

+0

@PascalThivent buen punto. En ocasiones, es posible que se le devuelva un objeto Criteria con un orden integrado (por ejemplo, desde un método de fábrica) y es posible que desee eliminar ese orden predefinido. Es por eso que llegué a esta pregunta. –

Respuesta

5

Parece que está intentando reutilizar un Criterio hecho para obtener una lista ordenada en lugar de obtener un conteo.

En lugar de tratar de usar los mismos Criterios para recuperar datos y contar, probablemente sea mejor que simplemente cree Criterios independientes.

Uso

Criteria orderCriteria= session.createCriteria(Libro.class) 
           .addOrder(Order.asc("ID")); 

para recuperar la lista en orden, y el uso

Criteria countCriteria= session.createCriteria(Libro.class) 
           .setProjection(Projections.rowCount()); 

llevar los conteos.

Para utilizar los mismos criterios para dos propósitos, debe cambiar el estado entre usos. No estoy seguro de cómo eliminar un pedido (o si realmente lo necesita para realizar un recuento). Para eliminar una proyección solo se requiere setProjection(null).

0

Si recibe criterios como un parámetro y lo hace un poco de cálculo con ella se podría utilizar .Clone() como en este caso:

private static int GetTotalRows(ICriteria criteria) 
    { 
     var countCriteria = (ICriteria)criteria.Clone(); 
     return Convert.ToInt32(countCriteria.SetProjection(Projections.RowCount()).UniqueResult()); 
    } 

Otra solución es utilizar ClearOrders lo que eliminará todo el orden de visualización.

private static int GetTotalRows(ICriteria criteria) 
    { 
     criteria.ClearOrders(); 
     ... 
    } 

Saludos

+0

'criteria.ClearOrders()' es qué ?? –

1

también habían enfrentado el mismo problema .. pero conseguido de la siguiente manera,

Antes de orden i preguntó el número de registros de la aplicación,

criteria.addOrder(pageCriteria.isSortDescending() ? Order 
          .desc(pageCriteria.getSortBy()) : Order 
          .asc(pageCriteria.getSortBy())); 

pageCriteria.setTotalRecords(((Integer) criteria 
          .setProjection(Projections.rowCount()) 
          .uniqueResult()).intValue()); 
       criteria.setProjection(null); 
       criteria.setFirstResult(
         pageCriteria.getFirstRecordOfCurrentPage()) 
         .setMaxResults(pageCriteria.getRecordsPerPage()); 
       criteria 
         .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

El código anterior funciona bien para mí.

0

no se puede eliminar el orden de los criterios. mi solución para la paginación es pasar Order [] como parámetro hacia el método que hace la paginación.

tienes que hacer esto solo si db es db2 as400 u otra base de datos que no permita el orden dentro de select count(*).

1

criteria.ClearOrders() es el método NHibernate proporcionado para eliminar pedidos.

En Java no existe tal método. Y mi solución a este problema es usar Order como otro parámetro pasar junto con Criteria a la función de consulta de paginación.

6

La mayoría de los criterios son en realidad instancias de CriteriaImpl. Si envía los Criterios a CriteriaImpl y obtiene el iterador para los pedidos, puede eliminarlos de esa manera.

Criteria criteria= session.createCriteria(Libro.class).addOrder(Order.asc("ID")); 
Iterator<Order> orderIter = ((CriteriaImpl)criteria).iterateOrderings(); 
while (orderIter.hasNext()) { 
    orderIter.next(); 
    orderIter.remove(); 
} 

Long totalRows = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult(); 
+0

¿hay algún iterador para las proyecciones también? Tengo el mismo problema y quiero acceder a mi lista de proyecciones –

Cuestiones relacionadas