Domanda

che sto cercando di fare domanda risultato impaginazione con Hibernate e displaytag, e Hibernate DetachedCriteria oggetti stanno facendo del loro meglio per stare nel modo. Mi spiego ...

Il modo più semplice per farlo impaginazione con displaytag sembra essere l'attuazione del PaginatedList interfaccia che ha, tra gli altri, i seguenti metodi:

/* Gets the total number of results. */
int getFullListSize();

/* Gets the current page of results. */
List getList();

/* Gets the page size. */
int getObjectsPerPage();

/* Gets the current page number. */
int getPageNumber();

/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();

Sto pensando di buttare la mia implementazione PaginatedList un oggetto Criteria per farlo lavorare insieme theese linee ...

getFullListSize() {
    criteria.setProjection(Projections.rowCount());
    return ((Long) criteria.uniqueResult()).intValue();
}

getList() {
    if (getSortDirection() == SortOrderEnum.ASCENDING) {
        criteria.addOrder(Order.asc(getSortCriterion());
    } else if (getSortDirection() == SortOrderEnum.DECENDING) {
        criteria.addOrder(Order.desc(getSortCriterion());
    }
    return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
                         getObjectsPerPage());
}

Ma questo non funziona, perché il addOrder() o le chiamate setProjection() modificano i criteri oggetto rendendola quindi utilizzabile per le chiamate successive. Io non sono del tutto sicuro del l'ordine delle chiamate, ma il db genera un errore sulla getFullListSize() cercando di fare un "select count(*) ... order by ..." che è ovviamente sbagliato.

Penso che potrei risolvere questo problema con la creazione di un oggetto della mia per tenere traccia delle condizioni di query e ricostruire l'oggetto Criteri per ogni chiamata, ma che si sente come reinventare un'altra ruota. C'è un modo più intelligente, forse la copia dei criteri inizialmente passati in e lavorano su quella copia?

Aggiorna : Sembra che getList viene chiamato per primo, e getFullListSize viene chiamato più volte dopo, quindi, non appena c'è un ordinamento passata, Criteria fallirà. Avrebbe senso per colpire il db solo una volta (in count direi) e cache i risultati, senza la necessità di copiare / ripristinare il select oggetto, ma ancora ...

Update (di nuovo) : Dimentica che, una volta ho fatto il <=> non posso fare il <=>, e viceversa. Ho davvero bisogno di due <=> oggetti distinti.

È stato utile?

Soluzione

bene, DetachedCriteria sono Serializable, in modo da avere built-in (se poco elegante) il supporto clone di profondità. Si potrebbe serializzare i criteri iniziali per un byte [] una volta per la costruzione, quindi deserializzare ogni volta che si desidera utilizzarlo.

Altri suggerimenti

Criteria.setProjection(null);
Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

Sarà effettivamente "resettare" i criteri tra la proiezione rowCount e l'esecuzione dei criteri stesso.

Vorrei fare che il vostro ordine non è stato aggiunto prima di fare la rowCount, sarà rallentare le cose. La mia implementazione di PaginatedList corre sempre una query conteggio prima di cercare i risultati, in modo da ordinare non è un problema.

http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make -E-easier.aspx

In quel post ho notato un metodo CriteriaTransformer.clone.

Questo dovrebbe copiare l'oggetto criteri.

È anche possibile impostare la proiezione del metodo GetList.

Woops non ho notato si stia riferendo a Java Hibernate. Comunque, questo http://forum.hibernate.org/viewtopic.php?t=939039

post sul forum dovrebbe essere in grado di rispondere alla tua domanda.

Ugly come può essere Ho finito per usare il trucco serializzazione. Ho serializzare l'DetachedCriteria oggetto una matrice di byte sulla costruzione del PaginatedList dell'oggetto e de-serializzare quando necessario. Ouch.

Un'altra cosa da provare:

implementare un DAO generico come quello suggerito sul sito di Hibernate e passarlo al PaginatedList oggetto, insieme a restrizioni oggetto. L'oggetto PaginatedList sarebbe allora fare qualcosa di simile

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .addOrder(<someOrder>)

e

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .setProjection(Projections.rowCount());

Non ho ancora provato, ma dovrebbe funzionare.

public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top