2013-02-03 82 views
1

我有一個實體,稱爲Status其中(除其他事項外)有許多一對多的關係,本身代表「可能的下一個狀態」的。JPA遞歸LEFT OUTER JOIN

的想法是能夠創造一個狀態之間的轉換的「地圖」。

現在,我正在嘗試創建一個狀態列表,該列表尚未鏈接到給定狀態以在「鏈接到此狀態」窗體中填充組合框(換句話說,我想要那些狀態可以鏈接)。

到目前爲止,我發現25點的方式不要這樣做。 :)

好了,所以很多人都在問的更多的細節 - 我想採取一些事情是理所當然的在合理的數據庫設計方面(和它們實際上並不重要的答案)。

a)所有狀態有且只有一個鍵列,它們的主鍵。

b)中的狀態是通過一個連接表,其中有2個外鍵,均爲的狀態的主鍵的手段「連接」到另一個。 c)如果我有狀態A,B,C和D - 並且我已經將狀態B和C「連接」到A,所以我有:A→B和A→C,目的是找到Status表中存在的狀態,這些狀態尚未連接到'A'。當我說'A'時,我的意思是作爲參數給出的狀態。所以,如果我正在查看狀態A,我希望所有那些沒有連接到'A'的人。如果我正在查看狀態C,我希望所有那些未連接到狀態C的用戶不管它們是否連接到不同的狀態。

任何幫助,將不勝感激。 我並不是在尋找一個確切的查詢詞,我正在尋找'它可以做到的方式'。我會很容易弄清楚如何將這個原則應用於我的特定DB設計,但是我無法找到適用的「原則」。

+0

如果沒有更好的理解設計,很難回答這個問題。例如,我不知道爲什麼你需要一個遞歸的左外連接。另一個例子,我不知道爲什麼如果你的狀態有一個代表自己鏈接的字段,爲什麼你不需要查詢鏈接字段爲空的所有狀態來收集所有未鏈接的狀態。但是,這可能是因爲我不明白你想要做什麼。 –

+0

嗨,它沒有一個鏈接到它自己的字段 - 它是一個** MANY TO MANY **關係,所以單獨的Join表用於匹配對。 – Iv4n

+0

你可以發佈你的模式嗎?你基本上有一個帶有代理鍵的模式表,另一個關係表有兩個FKEY到狀態表PKEY的字段?你只是想查詢狀態中關係表中沒有行的所有行?如果你不認爲我們在你的腦海中,並給我們更多的細節,你會得到更好的答案。也許發佈實體或模式。 –

回答

1
select notLinkedStatus from Status notLinkedStatus 
where notLinkedStatus.id not in 
    (select linkedStatus.id from Status status 
    inner join status.linkedStatuses linkedStatus 
    where status.id = :theStatusId)