2012-10-25 9 views

risposta

14

È possibile farlo quarantina di questo tipo: "alias" Ma assicuratevi di tagliare l'o.getProperty() in modo da passare solo la proprietà e non + immobili

 

    if (pageable != null) { 
       query.offset(pageable.getOffset()); 
       query.limit(pageable.getPageSize()); 
       for (Sort.Order o : pageable.getSort()) { 
        PathBuilder orderByExpression = new PathBuilder(Object.class, "object"); 

        query.orderBy(new OrderSpecifier(o.isAscending() ? com.mysema.query.types.Order.ASC 
          : com.mysema.query.types.Order.DESC, orderByExpression.get(o.getProperty()))); 
       } 
      } 

+0

contrassegnato come risposta, come la mia domanda è stato risposto e mi è venuto alla stessa soluzione, tranne usando MyClass.class invece di Object.class. Tuttavia come faccio a farlo in un modo generico, ad esempio MyClass è in realtà ? –

+1

È necessario riutilizzare orderByExpression, poiché è un genitore comune per l'ordine in base ai figli. Anche il nome è fuorviante, poiché i bambini sono l'effettivo "ordine per espressioni". –

+0

Questo tipo di opere per il mio caso, ma non completamente. Il problema è che ho bisogno di ordinare i campi calcolati (somma, conteggio). Li ho come alias ma il problema è che PathBuilder si aggiunge sempre alla query "alias". + proprietà. Nell'esempio restituisce sempre "ORDER BY object. {Alias}" che non è valido. Come posso ottenere che QueryDSL aggiunga semplicemente "ORDER BY {alias}"? – Cenobyte321

2

Non so se è ancora pertinente, ma esiste un'implementazione nei dati di primavera jpa per eseguire la conversione tra un oggetto data.domain.Sort (Spring JPA) a un OrderSpecifier (QueryDSL).

GIT Source of Querydsl Support in Spring JPA

E 'davvero brutto attuazione, ma si poteva ancora riutilizzarlo per il proprio scopo, come il metodo è privato:

public JPQLQuery applySorting(Sort sort, JPQLQuery query) 

Ma se si utilizza JPA i dati di primavera, l'implementazione repository personalizzati , devi solo fare:

public Page<MyObject> findAll(Predicate predicate, Pageable pageable) { 

    QMyObject myObject = QMyObject.myObject; 
    JPQLQuery jPQLQuery = from(myObject) 
      .join(myObject.user) 
      .where(predicate); 
    jPQLQuery = getQuerydsl().applyPagination(pageable, jPQLQuery); 
    List<MyObject> myObjectList = jPQLQuery.list(myObject); 
    long count = jPQLQuery.count(); 
    Page<MyObject> myObjectPage = new PageImpl<MyObject>(myObjectList, pageable, count); 
    return myObjectPage; 
} 

Spero che possa essere d'aiuto!

0

org.springframework.data.domain.Sort.Order e com.querydsl.core.types.Order e sono così simili, ma non esiste una conversione diretta tra i due. Questo è un po 'migliorata versione di frozenfury risposta:

PathBuilder<Entity> entityPath = new PathBuilder<>(Entity.class, "entity"); 
for (Order order : pageable.getSort()) { 
    PathBuilder<Object> path = entityPath.get(order.getProperty()); 
    query.orderBy(new OrderSpecifier(com.querydsl.core.types.Order.valueOf(order.getDirection().name()), path)); 
}