java - QueryDsl Sort dynamically -


i'd spring data return smaller dto class in place of full entities.

with of querydsl , spring data jpa, tried construct service queries entitypath, gives me compatible data tranfer object. i'd build query in dynamic way.

<!-- language: java -->     /**      * @param type dto class want query      * @param ep entitypath full class (generated qclass)      * @param pagerequest spring data jpa domain pagerequest instance      * @param predicate predicate generated .getvalue() on booleanexpression      */     @override     public page<? extends dtomarker> getpagedresultsfordto(class<? extends dtomarker> type, entitypath<?> ep , pagerequest pagerequest, predicate predicate) throws nosuchfieldexception, securityexception{              list<expression<?>> expressions = getexpressions(type, ep);      jpaquery query = new jpaquery(em);     query = query.from(ep).where(predicate);             if (pagerequest != null) {                 query = query.limit(pagerequest.getpagesize()).offset(pagerequest.getoffset());                              }      if (pagerequest.getsort() != null) {         (sort.order o : pagerequest.getsort()) {             query = query.orderby(toorderspecifier(o, ep));         }     }      list<? extends dtomarker> tuples = query.list(projections.bean(type, expressions.toarray(new expression[expressions.size()])));     return new pageimpl<>(tuples, pagerequest, getcounttotalsizefordto(type, ep, pagerequest, predicate)); }   private list<expression<?>> getexpressions(class<? extends dtomarker> type,         entitypath<?> ep) {     list<expression<?>> expressions = new arraylist<expression<?>>();     list<field> fields = new arraylist<field>();     (field field : type.getdeclaredfields()){         fields.add(field);     }     (field field : type.getsuperclass().getdeclaredfields()){         fields.add(field);     }     (field field : fields) {         string generictype = field.gettype().getsimplename();              if (generictype.equals("string")){                 expressions.add(new stringpath(ep, field.getname()));                                }             if (generictype.equals("boolean")) {                 expressions.add(new booleanpath(ep, field.getname()));             }             if (generictype.equals("long")) {                 expressions.add(new numberpath<long>(long.class, ep, field.getname()));             }     }     return expressions; } 

this works quite well, problem way implement sorting. convert spring data jpa sort querydsl by:

<!-- language: java --> @suppresswarnings({ "rawtypes", "unchecked" })     private orderspecifier<?> toorderspecifier(order order, entitypath<?> ep) {          comparablepath<?> sortpropertyexpression = new comparablepath(comparable.class, ep, order.getproperty());                  com.mysema.query.types.order orderexpression = order.isascending() ? com.mysema.query.types.order.asc                 : com.mysema.query.types.order.desc;          return new orderspecifier(orderexpression, sortpropertyexpression);     } 

but has issue strings not sorted ignorecase (= requirement)!

maybe road toward solution?:

<!-- language: java --> sortpropertyexpression = order.isignorecase() ? expressions.stringpath(order.getproperty()).lower() : expressions.stringpath(order.getproperty());  

but works stringpaths & gives exceptions numberpath etc..

anyone other ideas use dynamic sorting?


Comments