- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何用 PathBuilder 替换以下使用生成的 Q* 类和 java 反射的方法?
// member vars:
T operand; // can be a BigDecimal or a String
String tableName;
String fieldName;
String methodName;
public Predicate asPredicate()
{
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);
Class classParam = Object.class;
if(methodName.matches(".*like"){
classParam = String.class;
}
// method name is one of eq, ne, like...
Method m = colObj.getClass().getMethod(methodName, classParam );
return (Predicate) m.invoke(colObj, operand);
}
这很好用,但建议我在回答我的其他问题时使用 PathBuilder https://stackoverflow.com/questions/15269845/querydsl-extract-table-name-from-predicate-booleanexpression-object )这也会删除尴尬的 newInstance(tableName +"1000")。
PathBuilder<?> entityPath = new PathBuilder("foo.bar.database.model.Q"+ WordUtils.capitalize(tableName), "entity"); // what does the second param stand for?
PathBuilder relation = entityPath.get(fieldName);
// ???
两个问题:1)我现在可以在关系上调用 eq() 或 ne() 但不能调用 like()、notLike()2) 如何获取 colObj 以便我可以使用 java 反射 colObj.getClass().getMethod(...)
解决方案:感谢 Timo 的回答,除了两个 instanceof 条件之外,我完全放弃了反射,现在使用此代码:
tableClazz = Class.forName("foo.bar.database.model."+ WordUtils.capitalize(tableName));
PathBuilder<?> entityPath = new PathBuilder(tableClazz, tableName +"1000");
Predicate predicate = null;
if(operand instanceof String){
StringPath path = entityPath.getString(fieldName);
switch(type){
case EQ:
predicate = path.eq((String) operand);
case CONTAINS:
predicate = path.like("%" + operand +"%");
break;
// snip BEGINS WITH, ENDS WITH
}
}else if(operand instanceof BigDecimal){
assert(type.equals(Type.EQ));
NumberPath<BigDecimal> path = entityPath.getNumber(fieldName, BigDecimal.class);
predicate = path.eq((BigDecimal) operand);
}
if(negation){
return predicate.not();
}
return predicate;
最佳答案
你应该这样使用它
// entityClass is the entity type, not the Q-type
Class<?> entityClass = Class.forName(...)
// "entity" is the variable name of the path
PathBuilder<?> entityPath = new PathBuilder(entityClass, "entity");
// use getString to get a String path
Predicate predicate = entityPath.getString("property").like("a%");
关于QueryDSL:从 PathBuilder 生成谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273542/
如何用 PathBuilder 替换以下使用生成的 Q* 类和 java 反射的方法? // member vars: T operand; // can be a BigDecimal or a
我正在使用动态过滤器过滤 PrimeFaces DataTables。我使用 Spring org.springframework.data.jpa.domain.Specification 进行此工
我正在 Spring Boot API 中使用 Querydsl 来进行一些复杂的数据过滤,当我声明 PathBuilder 变量时,我发现首先您必须静态传递您的类,例如 YourClass.clas
不幸的是,QueryDSL 文档非常缺乏。对于许多方法,我不得不深入研究 grepcode 或在线追踪任何使用感兴趣方法的源代码,以试图弄清楚他们是如何使用它的。 那么 QueryDSL 的 Path
我是一名优秀的程序员,十分优秀!