Будьте в спящем режиме запрос критериев на различных свойствах различных объектов

Используйте менеджеров по расположению. Вы могли бы думать, что более просто только расположить все с трудными кодированными положениями теперь (особенно при использовании графического разметочного инструмента) но когда это прибудет время, чтобы обновить gui или интернационализировать его, преемники будут ненавидеть Вас. (Доверяйте мне на этом, я был парнем, говорящим для использования менеджеров по расположению от запуска и преемника парня, который проигнорировал меня.)

16
задан Mikko Maunu 18 August 2013 в 17:23
поделиться

3 ответа

Используйте псевдонимы вместо вложенных критериев :

Criteria criteria = session.createCriteria(A.class)
 .createAlias("b", "b_alias")
 .createAlias("c", "c_alias")
 .add(Restrictions.disjunction()
  .add(Restrictions.eq("b_alias.foo", "Something"))
  .add(Restrictions.eq("c_alias.bar", "0"))
 );
24
ответ дан 30 November 2019 в 17:39
поделиться

Вам нужно создать только один объект критериев, например:

Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
    .add(Restriction.eq("b.foo", "something"))
    .add(Restriction.eq("c.bar", 0)));
4
ответ дан 30 November 2019 в 17:39
поделиться

На случай, если кто-то еще сочтет это полезным, я нашел более сложный ответ на проблему, который, похоже, разрешен API, хотя мне не удалось проверить его до того, как ChssPly опубликовал его (проще ) решение:

DetachedCriteria bValues = DetachedCriteria.forClass(A.class);
bValues.createCriteria("b").add(Restrictions.eq("foo", "something"));

DetachedCriteria cValues = DetachedCriteria.forClass(A.class);
cValues.createCriteria("c").add(Restrictions.eq("bar", 0));

Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues));
3
ответ дан 30 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

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