2015-03-13 69 views
0

我有两个表(关于足球):联盟和团队是一对多的关系。现在我想获得所有联赛,但只能与那些名字从例如与“S”。休眠HQL查询与第二个表的条件

到目前为止,我有这样的:

Query query = session.createQuery("select l from League l left join l.teams as t with t.name like :name order by l.id"); 
query.setParameter("name", "S%"); 
List<League> list = query.list(); 

该查询返回所有联赛,也是所有球队。它看起来像条件​​被忽略。

我只想得到所有联赛以及属于特定联赛的那些球队(由某些条件指定)。所以有可能得到一个没有球队的联赛。

在联赛等级的变换

@OneToMany(mappedBy = "league", fetch = FetchType.EAGER) 
private List<Team> teams; 

在组类:

@ManyToOne 
@JoinColumn(name = "LEAGUE_FK") 
private League league; 

我使用Oracle数据库。 查询有什么问题?

在此先感谢。

回答

1

league.getTeams()该合同是回到联赛的球队。不管你发现联盟的方式如何,这个方法总是会回来的。

查询返回所有至少有一队首发与S.

你需要查询的联赛有点像

select l, t from League l left join l.teams t on t.name like :name order by l.id 

这应该让你List<Object[]>每个的第一要素aray是联盟,第二个是空或者以S开头的团队。

+0

它的工作原理与你所描述的一样,但我仍然不明白,为什么不能通过某些条件直接选择球队。那么这是如何过滤团队的唯一方式? – Tomask 2015-03-14 19:02:16

+0

联盟和球队之间的联系被用来模拟联盟A拥有球队1,2和3的事实。联盟的一个实例代表了数据库中的联盟。其团队集合代表数据库中联盟的团队。它不代表先前的查询发生了什么。 – 2015-03-14 22:32:34

-1

尝试此查询:

Query query = session.createQuery("select l from League l where l in (select l from Team t where t.name like :name) order by l.id"); 
query.setParameter("name", "S%"); 
+0

查询有什么问题?它的回报正是答案想要的:“我想要的只是获得所有联赛以及属于特定联赛的那些球队(由某些条件指定)。”光修改后查询将返回第二个问题的答案:“所以有可能得到一个没有团队的联赛”。 – 2015-03-13 08:10:45

+0

1.'从队伍t中选择l,其中t.name如:name'没有意义。 2.“我在哪里”将无法工作。而且一旦你使这个查询有效,它会比OP的慢,并且有完全相同的问题:它仍然返回联赛,并且调用league.getTeams()仍然会返回所有联盟的球队。 – 2015-03-13 08:15:09