我需要使用静态元模型在JPA Criteria中执行JOIN FETCH,但是如果没有得到未经检查的异常警告我就会无法理解。
假设我们有一个Thing实体,其中包含一个lazily-initialized Other实体。我想检索带有其他的东西,其中other.someField =“someValue”。这大致是我会这样做的:
public List<Thing> getThings() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Thing> cq = cb.createQuery(Thing.class);
Root root = cq.from(Thing.class);
// This gives an unchecked cast warning:
Join<Thing, Other> other = (Join<Thing, Other>) root.fetch(Thing_.other);
cq.select(root).where(cb.equal(other.get(Other_.someField), "someValue"));
return em.createQuery(cq).getResultList();
}
但是,由于Join和Fetch接口没有任何共同之处,因此我收到了“未经检查的强制转换”警告。我想摆脱那个警告(不使用@SuppressWarnings)。
我想我可以这样做:
cb.equal(root.get(This_.THING).get(Other_.SOMEFIELD), "someValue"))
但我怀疑它是否更好,因为我在这里操作弦乐(所以没有类型安全)。
什么是实现上述目标的更清洁方式?
不应该使用Fetch方法来创建JPA连接。在JPA中,join用于创建条件,而不是用于加载数据。这与本机SQL不同。对于JOIN使用:
Join<Thing, Other> other = root.join(Thing_.other);
无论是否调用join(),都可以加载独立集合:
root.fetch(Thing_.other);