创建JPA标准完全动态(Create a JPA Criteria fully dynamicall

2019-06-23 21:47发布

通常我是一个Hibernate用户和我的新项目,我们使用JPA 2.0。

吾道接收具有通用的容器。

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.get(container.getFieldId()), container.getValue());
}

因为我必须指定这样的类型:

if (">".equals(container.getOperation()) {
  criteriaBuilder.greaterThan(root.<Long>get(container.getFieldId()), (Long)container.getValue());
}

但我并不想这样做! 因为我使用一个通用的在我的容器! 你有一个想法?

Answer 1:

只要你TComparable (必须为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);
        } 
        ...
    }
    ...
}


文章来源: Create a JPA Criteria fully dynamically