Критерии api-эквивалент для объединения ребенка с родителем - PullRequest
0 голосов
/ 27 июня 2011

Версия: Hibernate 3.3

Привет, у меня есть две простые модели:

class Parent {
  Long id; //auto generated sequence and primary key
  String name;
  Set<Child> children;
}

class Child {
  Long id;
  String name;
  Parent parent; 
}

со следующим hbm:

<class name="my.Parent" table=PARENT">
  <id name="id" column="PARENT_ID" type="java.lang.Long">
  <property name="name" column="NAME" type="java.lang.String">
  <set name="children" table="CHILDREN" inverse="true">
        <key><column name="PARENT_ID" not-null="true" /></key>
        <one-to-many class="my.Child" />
  </set>
</class>

<class name="my.Child" table=CHILD">
  <composite-id>
    <key-many-to-one name="parent" column="PARENT_ID" class="my.Parent" />
    <key-property name="id" column="CHILD_ID" type="java.lang.Long" />
  </composite-id>
  <property name="name" column="NAME" type="java.lang.String">
</class>

Чего я хочу добиться, так этоэто: "выберите всех детей, чье имя родителя" Джон ". Я не могу понять, как написать эквивалентный критерий API для hql, который выглядит следующим образом:

SELECT child
FROM Child as child join child.parent 
where parent.name = 'John'

Я пробовал ниже, ноон не генерирует ожидаемый запрос соединения:

Criteria c = session.createCriteria(Child.class);
c.createCriteria("parent").add(Restrictions.eq("name", "John");
c.list();

Может кто-нибудь увидеть, что я делаю неправильно?

Любые идеи будут высоко оценены.

1 Ответ

0 голосов
/ 11 июля 2011

Используя API критериев JPA 2.0, вы можете сделать:

criteriaBuilder cb =...
CriteriaQuery<child> q=....
Root<child> entity= ..... 
Join<child, parent> o = entity.join(child_.parent);
Path<parent> c = entity.get(child_.parent);
Path<String> name = c.get(parent_.name);
....  where( cb.equal(name, "john"));
...