Может быть, следующая выдержка из Глава 23 - Использование Criteria API для создания запросов учебника Java EE 6 проливает некоторый свет (на самом деле, я предлагаю прочитать всю главу 23):
Для запросов, которые переходят к связанным классам сущностей, запрос должен определить соединение со связанной сущностью, вызвав один из методов From.join
на корневой объект запроса или другой объект join
.Методы объединения аналогичны ключевому слову JOIN
в JPQL.
Цель объединения использует класс Metamodel типа EntityType<T>
для указания постоянного поля или свойства объединяемого объекта.
Методы объединения возвращают объект типа Join<X, Y>
, где X
является исходной сущностью, а Y
является целью объединения.
Пример 23-10 Присоединение к запросу
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = pet.join(Pet_.owners);
Объединения могут быть объединены в цепочку для перехода к связанным объектам целевого объекта без необходимости создания экземпляра Join<X, Y>
для каждого объединения.
Пример 23-11 Объединения в цепочкиВместе в запросе
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(Pet_.owners).join(Owner_.addresses);
При этом у меня есть несколько дополнительных замечаний:
Во-первых, следующая строка в вашем коде:
Root entity_ = cq.from(this.baseClass);
Заставляет меня думать, что вы как-то пропустили часть Статических Метамодельных Классов.Классы метамодели, такие как Pet_
в приведенном примере, используются для описания метаинформации постоянного класса.Обычно они генерируются с использованием процессора аннотаций ( канонических классов метамодели ) или могут быть написаны разработчиком ( неканоническая метамодель ).Но ваш синтаксис выглядит странно, я думаю, что вы пытаетесь имитировать то, что вы пропустили.
Во-вторых, я действительно думаю, что вы должны забыть этот assay_id
внешний ключ, вы находитесь здесь на неправильном пути.Вам действительно нужно начать думать об объекте и ассоциации, а не о таблицах и столбцах.
В-третьих, я не совсем понимаю, что именно вы имеете в виду, добавив предложение JOIN как можно более универсальным * 1055.* и как выглядит ваша объектная модель, поскольку вы ее не предоставили (см. предыдущий пункт).Таким образом, просто невозможно ответить на ваш вопрос более точно.
Подводя итог, я думаю, вам нужно прочитать немного больше о JPA 2.0 Criteria и Metamodel API, и я настоятельно рекомендую нижеприведенные ресурсы в качестве отправной точки.
См. Также
Связанный вопрос