Загадка запроса Критерии гибернации - PullRequest
0 голосов
/ 03 августа 2011

У меня есть схема с рядом ассоциаций OneToMany, где иерархия Ферма -> Поле -> RegionGroup -> Регион , и мне нужно иметь возможность запрашивать на основе значений в Ферме, Полеи регион.Работает следующая простая конструкция:

org.hibernate.Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .add(Restrictions.in("id", farmIds))
  .createCriteria("fields").add(Restrictions.in("id", fieldIds))
  .createCriteria("regionGroups")
  .createCriteria("regions").add(Restrictions.in("nutrientId", nutrientIds));
return criteria.list();

Однако, когда я пытаюсь учесть пустые списки, подаваемые в фильтры, ограничения больше не применяются, и я получаю набор результатов, содержащий все поля, поля и фермы.и регион.Я уверен, что это вопрос последовательности возвращаемых экземпляров Criteria, но я связываю себя в узлы, пробуя разные комбинации и быстро никуда не добираясь.Кто-нибудь получил предложение сохранить мое здравомыслие?

org.hibernate.Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
if (!farmIds.isEmpty()){
  criteria.add(Restrictions.in("id", farmIds));
}
org.hibernate.Criteria fieldCriteria = criteria.createCriteria("fields");
if (!fieldIds.isEmpty()){
  fieldCriteria.add(Restrictions.in("id", fieldIds));
}
if (!nutrientIds.isEmpty()){
  fieldCriteria.createCriteria("regionGroups")
    .createCriteria("regions").add(Restrictions.in("nutrientId", nutrientIds));
}
return criteria.list();
...