У меня есть модель данных, которая выглядит примерно так:
public class Item {
private List<ItemAttribute> attributes;
// other stuff
}
public class ItemAttribute {
private String name;
private String value;
}
(это, очевидно, упрощает многие посторонние вещи)
Что я хочу сделать, так это создать запрос, чтобы спросить все элементы с одним или несколькими конкретными атрибутами, идеально связанными с произвольными символами AND и OR. Сейчас я держу его простым и просто пытаюсь реализовать случай И. В псевдо-SQL (или псевдо-HQL, если вы бы), это было бы что-то вроде:
select all items
where attributes contains(ItemAttribute(name="foo1", value="bar1"))
AND attributes contains(ItemAttribute(name="foo2", value="bar2"))
Примеры в документах Hibernate, похоже, не рассматривали этот конкретный вариант использования, но он кажется довольно распространенным. Случай дизъюнкции также был бы полезен, тем более, что я мог бы указать список возможных значений, т.е.
where attributes contains(ItemAttribute(name="foo", value="bar1"))
OR attributes contains(ItemAttribute(name="foo", value="bar2"))
-- etc.
Вот пример, который работает нормально для одного атрибута:
return getSession().createCriteria(Item.class)
.createAlias("itemAttributes", "ia")
.add(Restrictions.conjunction()
.add(Restrictions.eq("ia.name", "foo"))
.add(Restrictions.eq("ia.attributeValue", "bar")))
.list();
Обучение тому, как это сделать, будет иметь большое значение для расширения моего понимания потенциала гибернации.:)