我的Java类A,B之间有以下配置,其关联表是A1,B1。 表A1与B1有一对多的关系,通过id列在数据库中定义。 B1有一个复合键。 我试图在hibernate中定义一个过滤器,这样在启用过滤器之后,当我查询A时,在结果中,我只检索一条B匹配A的id和源字段/列的记录,而不是整个集合B。
即使没有定义过滤器,我也在寻找解决方案。无法在hibernate映射中定义一对一,因为数据库在这些表之间定义了一对多关系。 B1表必须支持id的多个源记录,因此我们将B1中的id / source定义为复合键。 但从功能上讲,只有一个B的id-source组合是A的有效记录,这就是我通过这种映射实现的目标。
我一直试图看看是否在过滤器中,我可以某种方式将表B1与表A1连接在A1的id /源上,这样我就可以从B1中取出那1条记录。 但我无法弄清楚如何。 我不能在运行时使用setParameter()在过滤器上传入A1的id / source,因为A是另一个C类的子类,在C和A之间有一对多的关系。在应用程序中,我查询C by它的主键id1用于拉动整个树(对象树:C - > A - > B)或(表:C1 - > A1 - > B1)。
getCurrentSession().enableFilter("exportedInvoiceFilter");
我知道下面的代码片段中的这两行不起作用,但我试图看看Hibernate-Filter是否可以通过这种方式优化结果,我可以通过2列过滤/加入。
condition=":id = A1.d, :source= A1.source" />
整个映射如下:
<hibernate-mapping>
<class name="C" table="C1">
<id column="bId" name="bId" />
<set name="a" lazy="false" fetch="join">
<key>
<column name="bId" />
</key>
<one-to-many class="A" />
</set>
</class>
<class name="A" table="A1">
<id column="id" name="id" />
<property name="source" column="source"></property>
<set name="b" lazy="false" fetch="join" table="B1" inverse="true">
<key>
<column name="id"></column>
</key>
<one-to-many class="B" />
<filter name="filter1"
condition=":id = A1.id, :source= A1.source" />
</set>
</class>
<class name="B" table="B1">
<composite-id name="key"
class="D">
<key-property name="id">
<column name="id" sql-type="INT" />
</key-property>
<key-property name="source">
<column name="source" />
</key-property>
</composite-id>
</class>
<filter-def name="filter1">
<!--<filter-param name="id" type="INT"/>
<filter-param name="source" type="String"/>-->
</filter-def>
</hibernate-mapping>