我对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>
答案 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将自动加入它们。