Можно ли выполнить соединение с внешним ключом «один ко многим» с помощью построителя критериев? - PullRequest
1 голос
/ 19 июня 2019

Предположим следующие две модели базы данных:

Владелец : id, name

Домашнее животное : id, name, owner

, где Pet.owner - это внешний ключ для Owner id


Можете ли вы запросить всех пользователей с именем, похожим на Denise , у которых есть домашние животные с именем, похожим на Bella , используя критерий построения присоединения ?

SQL-запрос будет выглядеть примерно так:

SELECT o FROM Owner o JOIN Pet p ON o.id = p.owner
WHERE o.name LIKE 'Denise' AND p.name LIKE 'Bella'

Будут также использованы параметры сортировки, поэтому можно использовать только критерии запросов, вместо непосредственного создания типизированного запроса (и настройки параметров).

1 Ответ

1 голос
/ 19 июня 2019

Конечно, это так.Вы можете сделать с Criteria API все, что можете сделать с JPQL.

Прочитайте учебное пособие: https://www.objectdb.com/java/jpa/query/criteria

Ваш запрос будет выглядеть так:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Owner> criteriaQuery = criteriaBuilder.createQuery(Owner.class);

Root<Pet> pet = criteriaQuery.from(Pet.class);

Join<Pet, Owner> owner = pet.join(Pet_.owner);
criteriaQuery
        .select(owner)
        .where(criteriaBuilder
            .and(
                 criteriaBuilder.like(owner.get(Owner_.name), "Denise"), 
                 criteriaBuilder.like(pet.get(Pet_.name), "Bella")));

List<Owner> resultList = em.createQuery(criteriaQuery).getResultList();
...