繁体   English   中英

QueryDSL:从谓词(BooleanExpression)对象中提取表名称

[英]QueryDSL: extract Table name from Predicate (BooleanExpression) object

一种方法是动态构建Predicate的列表,该列表随后传递给数据库服务对象。 为了基于谓词列表创建表联接,我需要确定每个谓词的基础生成的类Q *。 在谓词上调用getType()getClass()没有帮助。

这就是我构建谓词的方式:

Class<?> tableClazz = Class.forName("foo.bar.database.model.Q"+ WordUtils.capitalize(tableName));
Object tableObj = tableClazz.getConstructor(String.class).newInstance(tableName +"1000");
Field colField = tableClazz.getDeclaredField(fieldName);
Object colObj = colField.get(tableObj);
// method name is one of eq, ne, like...
Method m = colObj.getClass().getMethod(methodName, classParam );
return (Predicate) m.invoke(colObj, operand);

查询构建代码:

JPAQuery query = new JPAQuery(entityManager);
query = query.from(company);
for(Predicate p : predicates){
   // if there's at least one predicat with the underlying db class Foo:
   query = query.join(company.foos, new QFoo());
   break;
}
List<Object[]> rows = query.where(predicates.toArray(new Predicate[0])).listDistinct(company.id);

不要将生成的Q类型用于动态表达式创建。 您可以改用动态路径http://www.querydsl.com/static/querydsl/2.9.0/reference/html/ch03.html#d0e1379

在你的情况下

Class<?> entityType = Class.forName(...)
PathBuilder entityPath = new PathBuilder(entityType, "entity");
PathBuilder relation = entityPath.get("relation");
Predicate predicate = relation.get...(...).eq(...)

对于路径提取,请使用此类http://www.querydsl.com/static/querydsl/2.9.0/apidocs/com/mysema/query/types/PathExtractor.html

PathExtactor从给定的Expression提取第一个路径

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM