如何在没有未经检查的转换的情况下在 JPA Criteria 中执行连接获取?

How to perform a join fetch in JPA Criteria without unchecked casting?

我需要使用静态元模型在 JPA Criteria 中执行 JOIN FETCH,但是我不知道如何在没有收到未经检查的异常警告的情况下执行此操作。

假设我们有一个 Thing 实体,其中有一个延迟初始化的 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 接口没有任何共同点,我收到 "unchecked cast" 警告。我想摆脱那个警告(不使用@SuppressWarnings)。

我想我可以这样做:

cb.equal(root.get(This_.THING).get(Other_.SOMEFIELD), "someValue"))

但我怀疑它是否更好,因为我在这里对字符串进行操作(所以没有类型安全)。

实现上述目标的更简洁的方法是什么?

Fetch 方法不适用于创建 JPA 连接。在 JPA 中,join 用于创建 where 条件,而不是用于加载数据。这与原生 SQL 不同。对于 JOIN 使用:

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

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

root.fetch(Thing_.other);