0

我有一个Foo与多对多关系的实体类Bar

...
<class name="Foo">
    ...
    <set name="bars" table="FooBar" lazy="true" batch-size="100" fetch="select">
        <key column="FooID" />
        <many-to-many column="BarID" class="Bar" />
    </set>
    ...
</class>
...

我正在尝试制作一个搜索屏幕,允许用户搜索Foo附加到特定Bar. Bar每个附加的所有sFoo都应显示在搜索结果中。

所以我尝试了这段代码:

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));

Foo这可以很好地过滤记录。但它也会过滤bars属性。所以我添加了这一行:

criteria.setFetchMode("bars", FetchMode.SELECT)

但这并没有做任何事情。

我在休眠会话的 Bar 上没有任何休眠过滤器。谁能帮我?

4

2 回答 2

0

Tom,由于您想返回Foo附加到特定 s 的 s Bar,因此您不需要使用左连接。您可以使用内部连接,然后Bar将通过 N+1 个选择获取 s(1 个选择以获取过滤Foo后的 s,然后每个Foo返回一个选择以获取其Bars)。

我上面的代码与您的代码非常相似,我注意到左连接会强制Bars 集合从初始结果集中加载,而内连接将使用 N+1 选择。我还尝试指定获取模式无效。就我而言,我不能使用内连接,因为我使用需要左连接的过滤器。例如:

criteria.add(Restrictions.not(Restrictions.ilike("bar.name", "FizzBuzz")));

在这种情况下,应该返回Foo没有's 的 a,因为它没有名为“FizzBu​​zz”的名称,但使用内部连接将消除所有没有s 的内容。如果其他人可以为汤姆的问题提供仍然使用左连接的替代答案,将不胜感激!BarBarFooBar

编辑:我发现了一个 Hibernate 错误报告,其中指出“如果将它与 createCriteria 结合以添加限制,则会忽略criteria.setFetchMode”:

https://hibernate.onjira.com/browse/HHH-3524

于 2012-10-10T22:10:49.717 回答
0

当您对集合项目有过滤器时,集合不会被初始化,并且稍后会在访问时懒惰地获取。也许 Hibernate 无法匹配 bar 和 barId。尝试

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));
于 2012-09-19T11:46:02.940 回答