2017-02-06 17 views
0
註明「NOT IN」的加入集合

我有以下對象:用戶和角色如何在Hibernate中

我有我的數據庫叫做user_role的,它創建了一個多對多的關係,授予任何一個鏈接表用戶的任何角色。在我的java對象上,這種關係被映射爲使得用戶具有稱爲角色的集合,該集合是角色類型的列表。

我有一個按角色搜索用戶的服務。這很容易。

「從用戶選擇* U加入u.roles的角色,其中role.id在(:theRoleIWant)」

工作正常。但是現在我想返回一個沒有角色的用戶列表。

例如,基本級別的用戶具有角色6並且管理用戶具有角色3.用戶可以具有這兩個角色,但對於我的查詢,我只對沒有角色ID 3的基本級別用戶感興趣所以我這樣做:

「選擇用戶* U加入u.roles的角色,其中role.id(6)和role.id不是在(3)」

此繼續返回用戶誰有兩個角色。有什麼我在這裏失蹤?

感謝您的時間, 瑪格麗特

回答

1

因爲您從排除「NOT IN」的一個不是「用戶」,而是「角色」。所以用戶仍然顯示在該查詢中。

想象一下,當你加入這個時,你的用戶A有角色1和2,這將成爲兩行。所以,如果你使用「ROLE.ID NOT IN 1」,你仍然有一排有角色2的用戶A.

+0

哦,我明白了。有趣。謝謝您的幫助 – Margaret

1

感謝Angga我完全可以採用不同的方法來完成查詢。這是我結束了:

select * from User u join u.roles as role where role.id in (:theRoleIWant) 
and not exists (select 1 from User inner_u join inner_u.roles as inner_role where inner_role.id in (:theRolesIWantToAvoid) and inner_u.id = u.id) 

annga我標記你的答案是正確的,因爲它幫助我找到我需要的實際語法。