与Criteria联系

时间:2012-04-09 18:37:33

标签: java hibernate criteria criteria-api

我对Hibernate非常陌生。我用Google搜索了两个小时,但我仍然无法弄清楚,如何在不使用HQL的情况下进行JOIN,只能按标准进行。我有表客户端(cID,名称)和访问(vID,vcID,日期)。关系是一对多(一个客户可以多次访问)。我也想在没有setFetchMode的情况下这样做。只是标准。我是否必须更改mappping 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>

2 个答案:

答案 0 :(得分:3)

让一个具有列表属性“访问”的客户端映射到您的访问实体:

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

这将在您的客户表与您的访问表之间创建一个内部联接。

<强>更新

您可以在这里找到一些很好的例子:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-associations

映射示例

我几乎没有使用过hibernate映射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有一个属性“visits”代表一对多的关系。

答案 1 :(得分:1)

您需要更新映射:

 <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(...));

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

Hibernate将自动加入它们。