Create a JPA Criteria fully dynamically

criteria-api, generics, java, jpa-2.0

Solution

As long as your `T` is `Comparable` (it's required for `greaterThan`), you should be able to do something like the following:

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);
        } 
        ...
    }
    ...
}

Problem

Usually I'm a Hibernate user and for my new project we use JPA 2.0. My DAO receives a Container with a generic. ``` 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 } ``` The following lines won't compile: ``` if (">".equals(container.getOperation()) { criteriaBuilder.greaterThan(root.get(container.getFieldId()), container.getValue()); } ``` Because I must specify the type like this: ``` if (">".equals(container.getOperation()) { criteriaBuilder.greaterThan(root.<Long>get(container.getFieldId()), (Long)container.getValue()); } ``` But I don't want to do that! Because I use a generic in my container! Have you an idea?

Original source