JPA Criteria API - Как добавить предложение JOIN (как можно более общее предложение)

В текущем черновике стандарта C ++ 0x говорится (раздел 19.2):

1) В модели ошибок, отраженной в этих классах (т. е. типы исключений), ошибки делятся на две широкие категории: логические ошибки и ошибки времени выполнения.

2) Отличительной особенностью логических ошибок является то, что они связаны с ошибками во внутренней логике программы. Теоретически, их можно предотвратить.

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

Вместе с цитатами, приведенными в одном из других ответов, это объясняет, почему Boost.ProgramOptions бросает std :: logic_error для предотвращаемых ошибок, вызванных «ошибкой» предположительно обнаруживаемый до того, как программа выполнит '.

30
задан Pascal Thivent 9 October 2010 в 16:46
поделиться

1 ответ

Возможно, следующий отрывок из главы 23 - Использование API критериев для создания запросов учебного пособия по Java EE 6 прольет некоторый свет (на самом деле, я предлагаю прочитать всю главу 23):

Запрос отношений с помощью объединений

Для запросов, которые переходят к связанным классы сущностей, запрос должен определять присоединение к связанной сущности посредством вызов одного из методов From.join на корневом объекте запроса или другом присоединиться к объекту . Методы соединения: аналогично ключевому слову JOIN в JPQL.

Цель соединения использует Тип метамодели EntityType , чтобы указать постоянное поле или свойство присоединился к объекту.

Методы соединения возвращают объект введите Join , где X - это исходный объект и Y является целью соединение.

Пример 23-10. Присоединение к запросу

 CriteriaQuery  cq = cb.createQuery (Pet.class);
Метамодель m = em.getMetamodel ();
EntityType  Pet_ = m.entity (Pet.class);
Корень  pet = cq.from (Pet.class);
Присоединяйтесь к  owner = pet.join (Pet_.owners);

Объединения можно объединить в цепочку, чтобы перейти к связанным объектам целевая сущность без необходимости создавать экземпляр Join для каждого соединения.

Пример 23-11. Объединение в цепочку. в запросе

 CriteriaQuery  cq = cb.createQuery (Pet.class);
Метамодель m = em.getMetamodel ();
EntityType  Pet_ = m.entity (Pet.class);
EntityType <Владелец> Owner_ = m.entity (Owner.class);
Корень  pet = cq.from (Pet.класс);
Присоединиться к <Владелец, Адрес> address = cq.join (Pet_.owners) .join (Owner_.addresses);

При этом у меня есть несколько дополнительных замечаний:

Во-первых, следующая строка в вашем коде:

Root entity_ = cq.from(this.baseClass);

наводит меня на мысль, что вы каким-то образом пропустили часть «Статические классы метамодели». Классы метамодели, такие как Pet_ в приведенном примере, используются для описания метаинформации постоянного класса. Обычно они генерируются с использованием процессора аннотаций ( канонических классов метамоделей ) или могут быть написаны разработчиком ( неканонической метамодели ). Но ваш синтаксис выглядит странно, я думаю, вы пытаетесь имитировать то, что пропустили.

Во-вторых, я действительно думаю, что вам следует забыть этот assay_id внешний ключ, вы здесь ошиблись. Вам действительно нужно начать думать об объекте и ассоциации, а не о таблицах и столбцах.

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

Подводя итог, я считаю, что вам нужно больше узнать о критериях JPA 2.0 и API метамодели, и я настоятельно рекомендую приведенные ниже ресурсы в качестве отправной точки.

См. Также

Связанный вопрос

41
ответ дан 27 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: