В текущем черновике стандарта C ++ 0x говорится (раздел 19.2):
1) В модели ошибок, отраженной в этих классах (т. е. типы исключений), ошибки делятся на две широкие категории: логические ошибки и ошибки времени выполнения.
2) Отличительной особенностью логических ошибок является то, что они связаны с ошибками во внутренней логике программы. Теоретически, их можно предотвратить.
3) В отличие от этого ошибки времени выполнения связаны с событиями, выходящими за рамки программы. Они не могут быть легко предсказаны заранее.
blockquote>Вместе с цитатами, приведенными в одном из других ответов, это объясняет, почему Boost.ProgramOptions бросает std :: logic_error для предотвращаемых ошибок, вызванных «ошибкой» предположительно обнаруживаемый до того, как программа выполнит '.
Возможно, следующий отрывок из главы 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 метамодели, и я настоятельно рекомендую приведенные ниже ресурсы в качестве отправной точки.