QueryDSL动态查询如何使用字段名字符串做查询

QueryDSL动态查询如何使用字段名字符串做查询

Xy718 711 2021-06-01

前端传来需要查询的字段名,然后动态构建Predicate数据做查询

List<Predicate> predicates = new ArrayList<>();

QXxx qX=QXxx.qXxx;
StringPath path = Expressions.stringPath(qX,"someColParam");
predicates.add(path.like("%XXX%"));

...
predicates.add(XXX)
predicates.add(XXX)
...

List<X> result= jpaQueryFactory
		.select(qX)
                .from(qX)
                .where(
                        predicates.toArray(new Predicate[0])
                )
                .fetch();

即可
someColParam就是前端传来的字段名

在一些大数据运算输出的项目里会遇到这种场景,因为需要定义公共字段和模型记录。当然,不限于此

之前想用
new StringPath(qX,"someColParam")来生成expression,但是高版本的QueryDsl已经将这些Path子类的构造函数改为了protected,所以无法直接定义XXPath,而是要使用Expressions或者ExpressionUtils来构建Predicate要用的expression,这里猜测QueryDsl团队这么做的原因应该是为了统一接口,提升框架优雅罢?

PS: Leader显出极高兴的样子,将两个指头的长指甲敲着屏幕,转头对我说道,“对呀对呀!……Predicate有四样写法,你知道么?” 我愈不耐烦了,努着嘴关了IDEA。Leader刚用指甲扣了扣键盘,想在方法上码来,见我毫不热心,便又叹一口气,显出极惋惜的样子。