一种方法是动态构建一个Predicate
列表,稍后传递给数据库服务对象。为了创建基于谓词列表的表连接,我需要确定每个谓词的基础生成类Q *。在Predicate上调用getType()
或getClass()
并没有帮助。QueryDSL:从谓词(布尔表达式)对象中提取表名
这是我建立的谓词:
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);
哪个Querydsl你正在使用模块,JPA,SQL还是其他? – 2013-03-07 11:31:46
我正在使用JPA。生成的Q *类扩展com.mysema.query.types.path.EntityPathBase – 2013-03-07 11:46:05