У меня есть схема с рядом ассоциаций 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();