2015-03-13 71 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