6

通常、私は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.get(container.getFieldId()), container.getValue());
}

次のようにタイプを指定する必要があるためです。

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

しかし、私はそれをしたくありません!コンテナでジェネリックを使用しているからです!アイデアはありますか?

4

1 に答える 1

5

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);
        } 
        ...
    }
    ...
}
于 2012-04-24T11:37:01.100 に答える