2012-10-25 22 views

Trả lời

14

Bạn có thể làm điều gì đó như thế này: "alias" Nhưng chắc chắn để cắt o.getProperty() vì vậy bạn chỉ vượt qua tài sản và không phải sở hữu +

 

    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

đánh dấu câu trả lời là câu hỏi của tôi đã được trả lời và tôi đi đến cùng giải pháp ngoại trừ sử dụng MyClass.class thay vì Object.class. Tuy nhiên làm thế nào để tôi làm điều này một cách chung chung, ví dụ như MyClass thực sự là ? –

+1

Bạn nên sử dụng lại orderByExpression, vì nó là một phụ huynh phổ biến cho thứ tự của trẻ em. Ngoài ra tên là gây hiểu lầm, vì trẻ em là "thứ tự theo biểu thức" thực tế. –

+0

Loại tác phẩm này dành cho trường hợp của tôi, nhưng không hoàn toàn. Vấn đề là tôi cần phải sắp xếp các trường được tính toán (tổng, đếm). Tôi có chúng như bí danh nhưng vấn đề là PathBuilder luôn gắn thêm vào truy vấn "bí danh". + tài sản. Trong ví dụ này, nó luôn trả về "ORDER BY object. {Alias}" không hợp lệ. Làm thế nào tôi có thể nhận QueryDSL để chỉ thêm "ORDER BY {alias}"? – Cenobyte321

2

Tôi không biết nếu nó vẫn còn có liên quan nhưng có một thực hiện trong jpa dữ liệu mùa xuân để thực hiện việc chuyển đổi giữa một đối tượng data.domain.Sort (Spring JPA) thành một OrderSpecifier (QueryDSL).

GIT Source of Querydsl Support in Spring JPA

Đó là thực hiện thực sự xấu xí nhưng bạn vẫn có thể tái sử dụng nó cho mục đích riêng của bạn như method là private:

public JPQLQuery applySorting(Sort sort, JPQLQuery query) 

Nhưng nếu bạn sử dụng Spring dữ liệu JPA, trong việc thực hiện Repository tùy chỉnh của bạn , bạn chỉ cần làm:

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

Hy vọng điều đó có thể hữu ích!

0

org.springframework.data.domain.Sort.Ordercom.querydsl.core.types.Order và rất giống nhau, nhưng không có chuyển đổi đơn giản giữa hai. Đây là phiên bản được cải thiện một phần của frozenfury câu trả lời:

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)); 
} 
Các vấn đề liên quan