Объединение с критериями

Я ужасно новичок в Hibernate. Я два часа гуглил, но так и не понял, как сделать JOIN без использования HQL, только по критериям. У меня есть таблицы Клиенты (cID, имя) и Посещения (vID, vcID, дата). Отношение один ко многим (один клиент может посетить несколько раз). Я также хотел бы сделать это без setFetchMode. Просто Критерии. Должен ли я изменить сопоставление xml?

ОБНОВЛЕНИЕ: это часть моего сопоставления xml:

 <class name="Client" table="Clients">
   <id name="cID" column="cID"><generator class="native"/></id>
   <property name="name"     length="10" not-null="true"/>
 </class>
 <class name="Visit" table="Visits">
   <id name="vID" column="vID"><generator class="native"/></id>
   <property name="vcID"     length="10" not-null="true"/>
   <property name="date" length="25" not-null="true"/>
 </class>

person user1091733    schedule 09.04.2012    source источник
comment
Можете ли вы опубликовать здесь, каково ваше текущее сопоставление и как вы пытаетесь сделать запрос? мало информации.   -  person Eugene Retunsky    schedule 09.04.2012


Ответы (2)


Вам необходимо обновить отображение:

 <class name="Client" table="Clients">
   <id name="cID" column="cID"><generator class="native"/></id>
   <property name="name"     length="10" not-null="true"/>
   <!-- Declare Set<Visit> visits in the Client class-->
   <set name="visits" lazy="false" cascade="all">
        <key column="vcID"/>
        <one-to-many class="your.package.Visit"/>
    </set>
 </class>
 <class name="Visit" table="Visits">
   <id name="vID" column="vID"><generator class="native"/></id>
   <!-- and add "Client client" property to your Visit class --> 
   <many-to-one name="client" column="vcID" lazy="false"/> 
   <property name="date" length="25" not-null="true"/>
 </class>

Потом:

 Criteria criteria = session.createCriteria(Visit.class).addCriteria("client")
                      .add(Restriction.eq(...));

or

Criteria criteria = session.createCriteria(Client.class).addCriteria("visits")
                      .add(Restriction.eq(...));

И Hibernate присоединится к ним автоматически.

person Eugene Retunsky    schedule 09.04.2012

Наличие класса Client со списком-атрибутом «посещения», который сопоставляется с вашим Visit-Entity:

Criteria criteria = session.createCriteria(Client.class);
criteria.addCriteria("visits");

Это создаст внутреннее соединение между вашей таблицей клиентов и таблицей посещений.

Обновление:

Здесь вы найдете несколько хороших примеров: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-associations

Пример сопоставления

Я почти никогда не использую xml для сопоставления спящего режима, однако он должен выглядеть примерно так:

   <class name="Client" table="Clients">
      <id name="cID" column="cID"><generator class="native"/></id>
      <property name="name"     length="10" not-null="true"/>

      <bag name="visits">
           <key column="vcId"/>
           <one-to-many class="Visit"/>
      </bag>
    </class>

Сообщите Hibernate, что есть свойство «посещения», которое представляет отношение «один ко многим».

person PepperBob    schedule 09.04.2012
comment
Но как решить эту проблему без специальных посещений списков-атрибутов? Я ищу эквивалент для SELECT name FROM Clients JOIN Visits ON vcID = cID. В первом посте я поместил свой XML-маппинг. Должен ли я что-то изменить там? - person user1091733; 09.04.2012
comment
Да, вашему классу Client требуется сопоставление коллекции с вашим классом Visits, особенно. определение отношения 1-n см. в ссылка - person PepperBob; 09.04.2012
comment
Итак, если я реализовал такой список (частные посещения списка = новый ArrayList();), что я должен добавить к отображению xml? Этот документ не очень ясен для меня. - person user1091733; 09.04.2012