gpt4 book ai didi

java - JPA Criteria API 和类型安全

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:40 25 4
gpt4 key购买 nike

我似乎遗漏了 JPA 标准 API 及其类型安全性中的某些内容。考虑以下代码:

@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;
}

然后是一些代码来练习这个类,使用来自 the Java EE Tutorial 的页面构建:

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();

所以问题是:我能否使条件 API 查询更加类型安全,以便我只能将字符串传递给“from”子句?

最佳答案

类型安全仅限于 Expression<T> 的泛型类型的上限接口(interface),而不是元模型中定义的确切类型。所以,因为 CriteriaBuilder.equal(Expression<?> x, java.lang.Object y)采用 Expression<?> 类型的参数它允许传递任何对象进行比较。

其他CriteriaBuiler方法类型更安全,例如 CriteriaBuilder.ge(Expression<? extends java.lang.Number> x, Expression<? extends java.lang.Number> y)只允许数字。但是允许将整数字段与 float 进行比较。

没有比这更好的了。这些方法应该类似于 CriteriaBuilder.equal(Expression<T> x, T y) T 是元模型中的字段类型。

当然,这是标准 API 的类型安全漏洞。我不知道 JPA API 的创建者为什么选择这些方法的通配符版本。

关于java - JPA Criteria API 和类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12062038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com