2015-05-04 5 views
1

Если я использую Hibernate API критерии, как:Hibernate Критерии Api Multiselect

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); 

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

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

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

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

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

ответ

1

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

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

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

Пример:

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

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

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

Смежные вопросы