2016-10-19 4 views
1

J'ai écrit une requête à retourner comme ci-dessous;Mise en œuvre de la radiomessagerie avec hibernate envers

AuditReader reader = AuditReaderFactory.get(entityManager); 
List<Object[]> changes = reader.createQuery() 
    .forRevisionsOfEntity(cls, true, true) 
    // Various conditions 
    .getResultList(); 

Ce que je voudrais faire est d'obtenir les résultats dans les pages comme on peut le faire dans PagingAndSortingRepository<T,ID>, j'ai cette séance de travail presque comme indiqué ci-dessous

int start = page.getOffset(); 
int end = (start + page.getPageSize()) > history.size() ? history.size() : (start + page.getPageSize()); 
Page page = new PageImpl<HistoryEntry>(history.subList(start, end), page, history.size()); 

Mon problème est que lorsque vous avez terminé de cette façon que je impossible de trier les données comme prévu, c'est-à-dire que size=2&sort=action,desc ne triera pas quelle que soit la valeur que j'utilise (asc/desc).

history est une liste d'objets avec les champs suivants;

private String timestamp; 
private String userName; 
private String objectName; 
private String objectType; 
private String action; 
private String field; 
private String oldValue; 
private String newValue; 

Pour implémenter la pagination, le filtrage et le tri par ce besoin serait Envers à faire par la requête originale ou pourrait Envers regarder après la pagination?

+0

Je suis tombé sur cette question en essayant de réaliser la même chose. En y repensant, résoudriez-vous toujours le problème de l'obtention des résultats paginés de HistoryEntries de cette façon? (ou, auriez-vous maintenant créé un référentiel?) – Spork

Répondre

2

Il semble que la classe PageImpl s'attend à ce que le List<T> que vous fournissez dans le constructeur soit le sous-ensemble des lignes de la page donnée, déjà pré-triées. Par conséquent, nous devrons appliquer les opérations de tri dans le cadre de la requête Envers.

List<Object[]> changes = reader.createQuery() 
.forRevisionsOfEntity(cls, true, false) 
// various predicate conditions 
.addOrder(AuditEntity.property("someField").desc()) 
.getResultList(); 

Appliquer le genre de cette façon permettra alors le code où vous avez sélectionné le sous-ensemble de la page des résultats au travail comme prévu.