Hibernate Criteria API Multiselect

Если я использую Hibernate Criteria API, например:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root<OneEntity> entityOneRoot = criteriaQuery.from(OneEntity.class);
Root<TwoEntity> entityTwoRoot = criteriaQuery.from(TwoEntity.class);
criteriaQuery.multiselect(OneEntity, TwoEntity);

Нужно ли использовать EQUAL-ограничение (как ON-ограничение в SQL) для равенства идентификаторов между обеими таблицами (сущностями)? Из-за декартова произведения обеих таблиц?

criteriaQuery.where(criteriaBuilder.equal(OneEntity.get("fk_id"), TwoEntity.get("id")));

Я имею в виду... В SQL, использующем соединение, нам нужно использовать on-clausule, например:

select * from table_1 t1, table_2 t2 where t1.t2_id=t2.t1_id;

Но я не могу найти информацию об этом в критериях API.


person Wojciech Szymski    schedule 04.05.2015    source источник


Ответы (1)


Из спецификации JPA 2.1, глава 4.4.5 Соединения:

Внутреннее соединение может быть неявно указано с помощью декартова произведения в предложении FROM и условия соединения в предложении WHERE. При отсутствии условия соединения это сводится к декартовому произведению.

Основной вариант использования этого обобщенного стиля соединения — это когда условие соединения не включает отношение внешнего ключа, которое сопоставляется с отношением сущностей.

Пример:

SELECT c FROM Customer c, Employee e WHERE c.hatsize = e.shoesize

В общем, использование этого стиля внутреннего соединения (также называемого тета-соединением) менее типично, чем явно определенные соединения по связям.

Поскольку JPQL работает так же, как Criteria API, в вашем запросе необходимо такое же ограничение.

person wypieprz    schedule 05.05.2015