如何在没有未选中的转换的情况下在JPA Criteria中执行连接提取?

问题描述 投票:1回答:1

我需要使用静态元模型在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"))

但我怀疑它是否更好,因为我在这里操作弦乐(所以没有类型安全)。

什么是实现上述目标的更清洁方式?

hibernate jpa jpa-2.0 criteria criteria-api
1个回答
0
投票

不应该使用Fetch方法来创建JPA连接。在JPA中,join用于创建条件,而不是用于加载数据。这与本机SQL不同。对于JOIN使用:

Join<Thing, Other> other = root.join(Thing_.other);

无论是否调用join(),都可以加载独立集合:

root.fetch(Thing_.other);
© www.soinside.com 2019 - 2024. All rights reserved.