我使用@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条记录,其中一些记录有referrers
,redirects
或两者都没有。然后我执行了以下查询:
Criteria browseCriteria = getSession()
.createCriteria(Client.class)
.setFirstResult(0)
.setMaxResults(10)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.addOrder(SortUtil.order(order, sort));
browseCriteria.list();
我发现了以下行为:
FetchType.EAGER
,则上述查询会返回7个结果,省略那些既没有引荐来源也不重定向的实体。FetchType.LAZY
,则返回所有实体(按预期方式)。setFetchMode("client.referrers", FetchMode.SELECT)
之类的内容,则只返回5个结果,因为在确定第一个/最大结果后,似乎应用了 DISTINCT_ROOT_ENTITY。这与this FAQ Collection result = new LinkedHashSet( session.create*(...).list() );
基本相同
醇>
有没有办法构建上述查询,以便我可以使用FetchType.EAGER
并获取所有结果,包括那些没有引用或重定向的结果?如果可能的话,我想避免使用HQL。