CriteriaBuilder
JPA 2のクラスを使用して、なぜこのようなクエリを作成できるのか興味があります。属性として呼び出されるUser
永続化されたクラスがあるとします。なぜ私はこれを書くことができますか?String
name
CriteriaBuilder builder = mgr.getCriteriaBuilder();
CriteriaQuery<User> crit = builder.createQuery(User.class);
Root<User> user = crit.from(User.class); // 1
crit.select(user)
.where(builder.equal(user.get(User_.name), 2.5)); // 2
まず、マーカー1で:なぜUser.class
もう一度指示する必要があるのですか?私のCriteriaQueryは、とにかくユーザーに興味があることを知っているはずではありませんか?ここに別のクラスを注入することは、型安全性を損なうのではないでしょうか?
次に、マーカー2で:name
プロパティはString
。String
aをdoubleと比較して、なぜこのようなナンセンスをコンパイルできるのですか?言い換えると、呼び出されたequal
メソッドのシグネチャが次のようになるのはなぜですか。
public Predicate equal(Expression<?> x, Object y)
次のようにおそらくよりタイプセーフなバージョンの代わりに?
public <T> Predicate equal(Expression<T> x, T y)
Querydslのような他のクエリフレームワークは、この問題に対するより良い解決策を提供しますか?