JPA 2 критерий запроса, где в классе списка свойств - PullRequest
0 голосов
/ 12 февраля 2020

Я бы хотел выполнить запрос, указанный ниже, используя типизированный запрос:

SELECT
    a.*
FROM
    table_a a
    INNER JOIN table_b b ON a.id= b.id
WHERE
    b.url = 'value.org';

Критерий запроса:

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<A> criteriaQuery = criteriaBuilder.createQuery(A.class);
    final Root<A> root = criteriaQuery.from(A.class);
    root.fetch(A.domains); // domains is a List<B>
    criteriaQuery
            .select(root);

Объект A:

  @OneToMany
  List<B> domains;

Сущность B:

  @Column(name="URL")
  String url;

Моя проблема заключается в том, как воспроизвести, где, я пробовал что-то вроде:

 .where(criteriaBuilder.equal(root.get(A.domains).. ??))

, но я не знаю, как продолжить, потому что предложение предложения as (), in (..), et c ..

Есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 13 февраля 2020

Прежде всего, вам не нужно извлекать, потому что вы только хотите получить. Во-вторых, Вы почти хороши, единственная важная недостающая часть - это join. Вот код, который должен работать для Вас:

public A loadAForValueOrg() {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<A> query = builder.createQuery(A.class);
    Root<A> a = query.from(A.class);
    Join<A, B> b = a.join("domains");
    query.select(A);
    query.where(builder.equal(b.get("url"), "'value.org'"));
    TypedQuery<A> typedQuery = entityManager.createQuery(query);
    typedQuery.setMaxResults(1);
    List<A> result = typedQuery.getResultList();
    return result.isEmpty() ? null : result.get(0);
}

Несколько соображений:

  • setMaxResults не требуется, только хорошая практика для производительности
  • Если нет результат мы возвращаем null, так что это хороший кандидат на Java 8 Optional
  • Также я рекомендовал использовать метамодель , чтобы не работать со строками (это подвержено ошибкам) ​​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...