Ответ 1
Может быть, следующая выдержка из главы 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 и то, как выглядит ваша объектная модель, поскольку вы ее не предоставили (см. Предыдущий пункт). Таким образом, просто невозможно ответить на ваш вопрос более точно.
Подводя итог, я думаю, что вам нужно прочитать немного больше о JPA 2.0 Criteria и Metamodel API, и я настоятельно рекомендую нижеприведенные ресурсы в качестве отправной точки.
Смотрите также
- раздел 6.2.1. Классы статических метамоделей в спецификации JPA 2.0
- Динамические, безопасные для типов запросы в JPA 2.0
- Использование Criteria API и Metamodel API для создания базовых типобезопасных запросов