我很好奇为什么使用CriteriaBuilder
JPA 2 类可以创建这样的查询。假设我有一个名为as 属性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
属性是 a String
。为什么我可以编译这样的废话,将 aString
与 double 进行比较?换句话说,为什么被调用equal
方法的签名是这样的:
public Predicate equal(Expression<?> x, Object y)
而不是如下可能更安全的版本?
public <T> Predicate equal(Expression<T> x, T y)
像Querydsl这样的其他查询框架会为这个问题提供更好的解决方案吗?