Collections 了解集合对象上的HQL查询

Collections 了解集合对象上的HQL查询,collections,hql,Collections,Hql,这类似于一个。这个问题的答案部分解决了我的问题,但我在尝试执行我在那里指定的搜索时仍然存在一些问题;此外,我很难理解Hibernate如何在不同的场景中选择返回的内容 以下是我的映射: Client { @OneToMany(mappedBy="client",cascade=CascadeType.ALL) private Set<Group> groups = new HashSet<Group>(); } Group { @ManyToOn

这类似于一个。这个问题的答案部分解决了我的问题,但我在尝试执行我在那里指定的搜索时仍然存在一些问题;此外,我很难理解Hibernate如何在不同的场景中选择返回的内容

以下是我的映射:

Client {
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL)
    private Set<Group> groups = new HashSet<Group>();
}

Group {
    @ManyToOne (cascade=CascadeType.ALL)
    private Client client = new Client();

    private String name;  
    private String state; //two char state code
    private String extId; //unique identifier; candidate key, but not the @Id.
}

此查询返回单个客户端,但附加了所有关联的组,而不管组的状态代码是否与条件匹配:

select distinct client from Client as client
inner join client.groups as grp
where grp.state= :state
select distinct client from Client as client
inner join client.groups as grp
where grp.name like :name

最后,此查询为每个匹配的组返回一个单独的客户端副本,每个副本包含其所有关联的组,而不管组的名称是否符合以下条件:

select distinct client from Client as client
inner join client.groups as grp
where grp.state= :state
select distinct client from Client as client
inner join client.groups as grp
where grp.name like :name
我刚开始使用Hibernate,我发现自己无法预测给定查询将返回什么,这让我非常沮丧。除了WHERE子句中的一些小改动外,这三个查询几乎完全相同,但我得到的结果却完全不同。我花了很多时间查看文档,但是我不知道该行为的解释在哪里。有人能帮忙解释一下吗

最后,我真正需要做的是在通过
进行查询时返回
客户端
s,并且让客户端只包含与搜索条件匹配的
s。有没有一种简单的方法可以构造一个HQL查询来实现这一点,或者我必须执行多个查询并在代码中构建我的对象


谢谢。

这个问题有两个答案。首先,测试工具有一个问题,它(明智地)使用事务回滚来创建测试实例,而不在数据库中留下工件。这就是我在询问中奇怪回答的来源


通过简单地更改为外部fetch连接,我成功地返回了集合中所需的值。

这绝对不是我观察到的。您确定组集合是延迟加载的吗?您确定每个查询都有一个distinct,而没有fetch子句吗?使用alazy loaded collection的这三个查询在我的测试中具有与预期完全相同的行为。嗯,它没有为急切加载添加注释,我也没有执行fetch join,因此我不知道为什么或如何急切加载它。但以前是这样,所以我将尝试在Eclipse中清理构建。如果是这样的话,我会尖叫,然后进行火焰轰炸,不一定按那个顺序。FWIW,你看到了什么行为?您说过它们对您来说都是一样的,但这是什么?每个查询加载不同的实体,并且集合的所有元素在加载时都存在。看起来测试工具可能有问题。我在现有数据(ugh)处重新进行了测试,而不是在线束中设置的数据,现在得到的结果与您描述的相同。感谢您独立测试。你不会对我的最后一个问题有任何建议吧?:-)