2010-03-03 6 views
5

Ho un Criteri con:Rimuovere dinamicamente un ordinamento per il set di risultati in org.hibernate.Criteria

Tuttavia, quando voglio ottenere il conteggio delle righe venga meno

criteria.setProjection(Projections.rowCount()); 

perché ci è un ordine nella query.

Come rimuovere dinamicamente l'ordine nei criteri?

Voglio dire, sto cercando come criteria.removeOrder("ID").

+0

Hmm ... perché si chiama 'addOrder()' se non lo si desidera? –

+0

@PascalThivent buon punto. A volte è possibile che venga restituito un oggetto Criteria con un ordine predefinito (ad esempio da un metodo factory) e si desideri rimuovere tale ordinamento predefinito. Questo è il motivo per cui sono venuto in questa domanda. –

risposta

5

Sembra che tu stia cercando di riutilizzare un criterio creato per ottenere un elenco ordinato.

Piuttosto che cercare di utilizzare gli stessi criteri per il recupero dei dati e per il conteggio, è probabilmente preferibile creare semplicemente criteri indipendenti.

Usa

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

per recuperare l'elenco in ordine, e utilizzare

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

per ottenere i conteggi.

Per utilizzare lo stesso criterio per due scopi, è necessario modificare lo stato tra gli utilizzi. Non sono sicuro di come rimuovere un ordine (o se è davvero necessario per fare un conteggio). Per rimuovere una proiezione è sufficiente setProjection(null).

0

Se si riceve criteri come un param e si fa qualche calcolo con esso è possibile utilizzare .Clone() come qui:

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

Altra soluzione è quella di utilizzare ClearOrders che rimuoverà tutte le lista di ordine.

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

saluti

+0

'criteria.ClearOrders()' è cosa ?? –

1

Ho avuto anche affrontato lo stesso problema .. ma ho ottenuto in questo modo,

Prima di ordine ho chiesto il numero di record applicando,

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); 

Il codice sopra funziona bene per me.

0

non è possibile rimuovere l'ordine in base a criteri. la mia soluzione per l'impaginazione è passare Ordine [] come parametro verso il metodo che esegue l'impaginazione.

devi farlo solo se db è db2 as400 o altro database che non consente l'ordine entro select count(*).

1

criteria.ClearOrders() è il metodo NHibernate fornito per rimuovere gli ordini.

In Java non esiste un tale metodo. E la mia soluzione a questo problema è l'utilizzo di Order mentre un altro parametro passa insieme a Criteria alla funzione di query di impaginazione.

6

La maggior parte dei criteri sono in realtà istanze di CriteriaImpl. Se lanci i tuoi Criteria su CriteriaImpl e ottieni l'iteratore per gli ordini, puoi rimuoverli in questo modo.

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

c'è qualche iteratore per le proiezioni? Ho lo stesso problema e voglio accedere alla mia lista delle proiezioni –

Problemi correlati