Hibernate过滤器 - 如何将子项与父项连接以仅获取一个子项 - 无法传递参数

时间:2016-09-23 02:03:10

标签: java spring hibernate

我的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>

0 个答案:

没有答案