2012-10-25 5 views

Antwort

14

Sie können Somethings tun, wie folgt: „alias“ Aber stellen Sie sicher, dass die o.getProperty trimmen(), so dass Sie nur die Eigenschaft übergeben und nicht + Eigenschaft

 

    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

als Antwort markiert als meine Frage beantwortet wurde und ich kam zu der gleichen Lösung außer MyClass.class statt Object.class verwenden. Wie aber mache ich das generisch, zB MyClass ist eigentlich ? –

+1

Sie sollten den Befehl orderByExpression erneut verwenden, da es sich um einen gemeinsamen übergeordneten Code für die Reihenfolge von untergeordneten Elementen handelt. Auch der Name ist irreführend, da die Kinder die eigentliche "Ordnung durch Ausdrücke" sind. –

+0

Diese Art von Arbeiten für meinen Fall, aber nicht vollständig. Das Problem ist, dass ich berechnete Felder (Summe, Anzahl) sortieren muss. Ich habe sie als Aliase, aber das Problem ist der PathBuilder hängt immer an die Abfrage "Alias". + Eigenschaft. Im Beispiel wird immer "ORDER BY Objekt. {Alias}" zurückgegeben, was ungültig ist. Wie kann ich QueryDSL dazu bringen, einfach "ORDER BY {alias}" anzuhängen? – Cenobyte321

2

Ich weiß nicht, ob es ist immer noch relevant, aber es gibt eine Implementierung im Spring-Daten-jpa, um die Konvertierung zwischen einem data.domain.Sort (Spring JPA) -Objekt zu einem OrderSpecifier (QueryDSL) durchzuführen.

GIT Source of Querydsl Support in Spring JPA

Es ist wirklich hässlich Implementierung, aber man könnte es noch für eigene Zwecke wiederverwenden wie die Methode privat ist:

public JPQLQuery applySorting(Sort sort, JPQLQuery query) 

Aber wenn Sie Frühling Daten JPA verwenden, in Ihrer benutzerdefinierten Repository Implementierung , müssen Sie nur tun:

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

Ich hoffe, es könnte helfen!

0

org.springframework.data.domain.Sort.Order und com.querydsl.core.types.Order und sind so ähnlich, aber es gibt keine direkte Umwandlung zwischen den beiden. Dies ist etwas Version von frozenfury Antwort verbessert:

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)); 
} 
Verwandte Themen