Как выполнить выборку соединения в JPA Criteria без неконтролируемого приведения? - PullRequest
1 голос
/ 01 апреля 2019

Мне нужно выполнить JOIN FETCH в JPA Criteria с использованием статической метамодели, однако я не знаю, как это сделать без предупреждения о непроверенной исключительной ситуации.

Предположим, у нас есть объект Thing свнутри него лениво-инициализированная другая сущность.Я хочу получить вещи с извлеченными другими, где 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"))

Но я сомневаюсь, что лучше, видяздесь я работаю со строками (так что безопасность типов отсутствует).

Какой более чистый способ достижения вышеуказанного?

1 Ответ

0 голосов
/ 01 апреля 2019

Метод извлечения не предназначен для создания соединений JPA. В JPA объединение используется для создания условий, а не для загрузки данных. Это отличается от нативного SQL. Для РЕЙТИНГА используйте:

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

Независимо коллекция может быть загружена с или без вызова join ():

root.fetch(Thing_.other);
...