这类似于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查询来执行此操作,或者我是否必须执行多个查询并在代码中构建我的对象?
感谢。
答案 0 :(得分:1)
答案是双重的。一,测试工具存在问题,这是(合理地)使用事务回滚来创建测试实例而不会在数据库中留下工件。这是我在查询中奇怪回答的来源。
我设法通过简单地更改为外部提取连接,只返回我想要的值。