System.exit(-1)
Не гарантирует , что ваша программа остановится. Если у вас есть своего рода ловушка отключения , или если вы находитесь в середине потоковой операции, это можно предотвратить. Таким образом, компилятор выдает ошибку.
Возможно, вы захотите, чтобы Exception
покинул текущий слой.
Config c;
try {
c = new Config();
} catch (final Exception e) {
System.err.println("Error while parsing/reading file: " + e.getMessage());
throw new YourCustomRuntimeException(e);
}
c.whatever();
Мое понимание - то, что, если Вы делаете это использование HQL, Вы создаете Декартово соединение с фильтром, а не внутреннее объединение. Запросы критериев не поддерживают выполнение этого.
Существует a SQLCriterion
, который можно дать произвольный SQL
, и добавьте к Вашему Criteria
. В SQL
строка, маркер {псевдоним} "будет заменен псевдонимом корневого объекта".
В NHibernate вы можете использовать подзапросы, которые определены как DetachedCriteria. Не уверен, что он работает так же в Java, скорее всего, он такой же:
DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
.SetProjection(Projections.Property("pet.ownername"))
.Add(/* some filters */ );
session.CreateCriteria(typeof(Owner))
.Add(Subqueries.PropertyIn("name", pets);
Предполагается, что он объединен с использованием имени владельца.
Это действительно возможно с критериями:
DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("ownername", "bob"));
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.add(Property.forName("ownerId").in(ownerCriteria));
Обновление : это фактически выполняет подпросию вместо присоединения, но позволяет использовать критерии на двух объектах, которые не имеют Отношение к гибернации определена.