JPAのcriteriaAPIとその型安全性で何かを見逃しているようです。次のコードを検討してください。
@Entity
@Access(FIELD)
class User(
@Id
Long id;
@Column(unique=true)
String email;
String password;
}
ここにメタモデルがあります:
@StaticMetamodel(User.class)
public static class User_ {
public static volatile SingularAttribute<User, Long> id;
public static volatile SingularAttribute<User, String> email;
public static volatile SingularAttribute<User, String> password;
}
次に、Java EEチュートリアルのページを使用して構築された、クラスを実行するためのコード:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> user = cq.from(User.class);
cq.select(user);
cq.where(cb.equal(user.get(User_.email), "john@google.com")); //this line is my problem
TypedQuery<User> q = em.createQuery(cq);
List<User> allUsers = q.getResultList();
assertEquals(1, allUsers.size());
正常に動作します。ただし、 "where"句を変更して、文字列ではなく整数( "john@google.com")を使用すると、コードがコンパイルされないことが予想されました。それでも、正常にコンパイルされます。
基準APIはタイプセーフであると考えられていましたか?これは、標準のJPQLを使用した場合、以下よりもタイプセーフになることはほとんどありません。つまり、上記のコードのメタモデルの目的は何ですか?私はそれから何も得ていません。
User u = em.createQuery("select u from User u where u.email = :email", User.class)
.setParameter("email", "john@google.com")
.getSingleResult();
したがって、問題は次のとおりです。「from」句に文字列のみを渡すことができるように、条件APIクエリをよりタイプセーフにすることはできますか?