如何在JPA Criteria中执行联接获取而不进行未经检查的强制转换?

时间:2019-04-01 07:51:59

标签: hibernate jpa jpa-2.0 criteria criteria-api

我需要使用静态元模型在JPA Criteria中进行JOIN FETCH,但是我对如何做到这一点感到迷茫,而没有得到未经检查的异常警告。

假设我们有一个Thing实体,里面有一个延迟初始化的Other实体。我想用获取的Others检索事物,其中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"))

但是我怀疑它是否更好,因为我在这里使用String进行操作(所以没有类型安全性)。

实现上述目标的更干净的方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

可以在调用或不调用join()的情况下独立加载collection:

root.fetch(Thing_.other);