use*_*339 5 java generics criteria-api jpa-2.0
通常我是Hibernate用户,对于我的新项目,我们使用JPA 2.0.
我的DAO收到一个带有通用的Container.
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
}
Run Code Online (Sandbox Code Playgroud)
以下行不会编译:
if (">".equals(container.getOperation()) {
criteriaBuilder.greaterThan(root.get(container.getFieldId()), container.getValue());
}
Run Code Online (Sandbox Code Playgroud)
因为我必须指定这样的类型:
if (">".equals(container.getOperation()) {
criteriaBuilder.greaterThan(root.<Long>get(container.getFieldId()), (Long)container.getValue());
}
Run Code Online (Sandbox Code Playgroud)
但我不想那样做!因为我在容器中使用通用!你有个主意吗?
只要您T是Comparable(这是 必需的greaterThan),您就应该能够执行以下操作:
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);
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud)