отношение «один ко многим» и множественные условия с использованием критериев

У меня есть 2 таблицы:

  1. мастер table с отдельными атрибутами некоторых объектов (id, name, title, ...)
  2. таблица с повторяющимися атрибутами (master_id, attribute_name, attribute_value)

Пример данных для #2:

 - 10, "authors", "John Bill"
 - 10, "authors", "Merry J"
 - 10, "owners", "Chris O."
 - 11, "authors", "Andrew K."

Это отношение один ко многим:

<set name="repeating" table="xxx" cascade="none" mutable="false" lazy="true"    fetch="join">
<key column="...."/>
<one-to-many class="...." />
</set>

Я хочу найти главный объект (id=10), где "authors" = "John Bill" и "authors" = "Merry J" и "owners" = "Chris O."

Для первого условия я могу сделать это так:

session.createCriteria(Master.class)
.createCriteria("repeating")
.add(Restrictions.eq("attributeName", "authors"))
.add(Restrictions.eq("attributeValue", "John Bill"))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

Как добавить другие условия с помощью критериев?

Спасибо


person user3494426    schedule 03.04.2014    source источник


Ответы (1)


Я думаю, что вы хотите, это отдельные критерии

DetachedCriteria dc = DetachedCriteria.forEntityName("repeating")
    .add(Restrictions.eq("attributeName", "authors"))
    .add(Restrictions.eq("attributeValue", "John Bill"))
    // other rows
    .setProjection(Projections.distinct(Property.forName("masterId")));

session.createCriteria(Master.class)
    .add(Property.forName("id").in(dc))
    .list();
person hsluo    schedule 03.04.2014
comment
Спасибо, но это не нормально. владельцев является значением для attributeName. Это означает, что это должно быть сделано таким образом: .add(Restrictions.eq("attributeName", "owners")) .add(Restrictions.eq("attributeValue", "Chris O.")) Но в этом случае он не вернет никаких результатов. - person user3494426; 03.04.2014
comment
Извините за мою ошибку. тогда я предлагаю вам использовать Restrictions.disjunction() для построения ваших критериев, или в этом случае вам может показаться, что HQL проще писать. - person hsluo; 04.04.2014