了解集合对象的HQL查询

时间:2012-02-29 21:09:01

标签: collections hql

这类似于question I asked earlier。这个问题的答案部分解决了我的问题,但我仍然在尝试执行我在那里指定的那种搜索方面遇到了一些问题;此外,我很难理解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.
}

按名称查询是内联的(例如,与param两端的通配符一样); state和extId是平等的。

以下查询返回单个客户端,只附加了匹配组,即使其他组与客户端关联(再次注意extId只返回一个组):

select distinct client from Client as client
inner join client.groups as grp
where grp.extId = :extId

此查询返回单个客户端,但附加了所有关联组,无论该组的状态代码是否符合条件:

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子句中的一些小变化之外,所有三个查询几乎相同,但每个查询的结果都完全不同。我花了很多时间来检查文档,但是在解释这种行为的地方我都很遗憾。任何人都可以帮忙解释一下吗?

最后,我真正需要做的是在Client查询时返回Group,并让客户包含Group s符合搜索条件。有没有一种方法我可以构建一个HQL查询来执行此操作,或者我是否必须执行多个查询并在代码中构建我的对象?

感谢。

1 个答案:

答案 0 :(得分:1)

答案是双重的。一,测试工具存在问题,这是(合理地)使用事务回滚来创建测试实例而不会在数据库中留下工件。这是我在查询中奇怪回答的来源。

我设法通过简单地更改为外部提取连接,只返回我想要的值。