spring - QueryDSL dynamic predicates -
i need querydsl querying. i'm using library spring data jpa. service class:
@service("tblactivityservice") public class tblactivityservice implements abstractservice<tblactivity> { @resource private tblactivityrepository tblactivityrepository; @override public list<tblactivity> findall(predicate predicate) { return (list<tblactivity>) tblactivityrepository.findall(predicate); } }
i have dynamic list of filters:
@entity @table(name = "sys_filters") public class sysfilter implements serializable { private static final long serialversionuid = 1l; @id @generatedvalue(strategy = generationtype.identity) @basic(optional = false) @column(name = "filter_id") private integer filterid; @joincolumn(name = "user_id", referencedcolumnname = "user_id") @manytoone(fetch = fetchtype.eager) private sysuser userid; @size(max = 45) @column(name = "table_name") private string tablename; @size(max = 45) @column(name = "column_name") private string columnname; @size(max = 45) @column(name = "condition") private string condition; @size(max = 100) @column(name = "value") private string value; // getters & setters }
i have column name (e.g. title) have condition (e.g. ==, !=, >= etc.) - can store symbols or words (equals etc.) , have value.
the question "how dynamically generate predicate service?" table has 25 fields.
predicate looks that:
public booleanexpression buildfilteredresult(list<sysfilter> filters) { //todo it! return qtblactivity.tblactivity.title.eq("value"); // need dynamically each filter in list }
the problem how invoke columnname string value. have suggestions?
it might easier use mapping filter conditions operators
map<string, operator> operators = immutablemap.of( "==", ops.eq, "!=", ops.ne, ">", ops.gt, "<", ops.lt, ">=", ops.goe, "<=", ops.loe); expressions.predicate(operators.get(condition), stringpath, expressions.constant(filtervalue));
also make sure combine predicates properly
predicates.and(...)
returns new predicate , leaves predicates
untouched.
maybe booleanbuilder
after?
Comments
Post a Comment