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
Post a Comment