Java 完全动态地创建JPA标准

Java 完全动态地创建JPA标准,java,generics,jpa-2.0,criteria-api,Java,Generics,Jpa 2.0,Criteria Api,通常我是一个Hibernate用户,对于我的新项目,我们使用JPA2.0 我的DAO接收一个带有泛型的容器 public class Container<T> { private String fieldId; // example "id" private T value; // example new Long(100) T is a Long private String operation; // example ">" /

通常我是一个Hibernate用户,对于我的新项目,我们使用JPA2.0

我的DAO接收一个带有泛型的容器

public class Container<T> {
  private String fieldId;    // example "id"
  private T value;           // example new Long(100) T is a Long
  private String operation;  // example ">"

  // getter/setter
}
因为我必须指定如下类型:

if (">".equals(container.getOperation()) {
  criteriaBuilder.greaterThan(root.<Long>get(container.getFieldId()), (Long)container.getValue());
}
如果(“>”.equals(container.getOperation()){
greaterThan(root.get(container.getFieldId()),(Long)container.getValue());
}
但我不想这样做!因为我在容器中使用了泛型!
你有什么想法吗?

只要你的
T
可比的
大于
)就需要它),你就应该能够做如下事情:

public class Container<T extends Comparable<T>> { 
    ...
    public <R> Predicate toPredicate(CriteriaBuilder cb, Root<R> root) {
        ...
        if (">".equals(operation) {
            return cb.greaterThan(root.<T>get(fieldId), value);
        } 
        ...
    }
    ...
}
公共类容器{
...
公共谓词toPredicate(CriteriaBuilder cb,根){
...
如果(“>”).equals(操作){
返回cb.greaterThan(root.get(fieldId),value);
} 
...
}
...
}
public class Container<T extends Comparable<T>> { 
    ...
    public <R> Predicate toPredicate(CriteriaBuilder cb, Root<R> root) {
        ...
        if (">".equals(operation) {
            return cb.greaterThan(root.<T>get(fieldId), value);
        } 
        ...
    }
    ...
}