使用休眠标准,如何在左连接的基础上检索结果?

时间:2017-03-06 18:00:47

标签: java hibernate

我使用@ElementCollection有一个相当标准的父子实体关系,看来零过滤条件提取基于FetchType提供不同的结果。这是设置:

public final class Client {

    ....

    // Set of referrers.
    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "client_referrers",
            joinColumns = @JoinColumn(name = "client"))
    @Column(name = "referrer")
    @Type(type = "my.custom.URIType")
    private Set<URI> referrers = new TreeSet<>();

    // Set of redirects.
    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "client_redirects",
            joinColumns = @JoinColumn(name = "client"))
    @Column(name = "redirect")
    @Type(type = "net.krotscheck.kangaroo.database.type.URIType")
    private Set<URI> redirects = new TreeSet<>();

    ....
}

我在数据库中播放了10条记录,其中一些记录有referrersredirects或两者都没有。然后我执行了以下查询:

    Criteria browseCriteria = getSession()
            .createCriteria(Client.class)
            .setFirstResult(0)
            .setMaxResults(10)
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .addOrder(SortUtil.order(order, sort));
    browseCriteria.list();

我发现了以下行为:

  1. 如果我使用FetchType.EAGER,则上述查询会返回7个结果,省略那些既没有引荐来源也不重定向的实体。
  2. 如果我使用FetchType.LAZY,则返回所有实体(按预期方式)。
  3. 如果我添加setFetchMode("client.referrers", FetchMode.SELECT)之类的内容,则只返回5个结果,因为在确定第一个/最大结果后,似乎应用了 DISTINCT_ROOT_ENTITY。这与this FAQ
  4. 中推荐的Collection result = new LinkedHashSet( session.create*(...).list() );基本相同

    有没有办法构建上述查询,以便我可以使用FetchType.EAGER并获取所有结果,包括那些没有引用或重定向的结果?如果可能的话,我想避免使用HQL。

0 个答案:

没有答案