Hibernate,collection fetch eager只返回一个元组,使用标准setMaxResults(1)

时间:2015-08-12 08:47:12

标签: sql hibernate java-ee jpa orm

public static final class EntityA {

        @Id
        Long id;

        @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
        Set<EntityB> set = new HashSet<>();
}

public static final class EntityB {
        @Id
        Long id;

        String name;
}

但是,当我使用hibernate标准查询EntityA时,执行criteria.setMaxResults( 1 );

设置仅返回一个元组,即使它包含更多元组。

当我忽略setMaxResults(1)时,我确实得到了集合中的所有内容以及我的EntityA实例。

此外,当我使用@Fetch(FetchMode.SELECT)时,尽管有setMaxResults(1),但我确实得到了所有内容。

此外,当我使用setFetchSize(1)时,如果不是setMaxResults(1),它也会返回全部,但我相信应该使用setMaxResutls来限制EntityA上的返回列表。

这是一个错误吗?

SUBSELECT不如JOIN高效,为什么我想了解为什么会这样。

标准正在EntityA上使用,最大结果就是在那里。

1 个答案:

答案 0 :(得分:0)

setMaxResults限制行数,而不是您想要获得的实体实例数量(请参阅section Pagination)。

默认情况下,EntityA的设置基于您发布的实体模型,使用 join 与entityA实例一起提取。因此,将MaxResults设置为1限制只检索一行,这意味着实例实体A和关联的实体。

使用FetchMode.SELECT将由与检索entityA的查询不同的select查询检索。

我建议您查看this以及有关Hibernate手册performance的部分,了解您拥有的选项以及获取策略的功能(同时here是 - 示例解释)