2011-04-02 34 views
3

鑑於通過Hibernate JPA訪問數據庫的這兩個實體,是否需要制定一個JPA查詢幫助,請

@Entity class A { 
    int id; 
    String aName; 
} 

@Entity class B { 
    int id; 
    String bName; 
    @ManyToMany Set<A> aRefs; 
} 

的結果,我想是有不是aName一切都一個實體的集合由B個實體引用的。或換句話說,所有A不屬於任何BaRefs

我使用NOT EXISTSNOT MEMBER OF與子查詢嘗試了一些替代品,甚至與LEFT OUTER JOIN小號涉足,但煩人的是我想出或者通過Hibernate的解釋遭到拒絕,甚至最終會轉化爲多數民衆贊成否決無效SQL查詢由Oracle提供。

回答

0

3人們對這個問題表現出興趣,所以我想我會分享我的答案。我主要是通過反覆試驗來達到這個目的的;我很抱歉地說我仍然沒有「理解」JPA查詢語言。

2的查詢工作是:

SELECT a FROM A a WHERE NOT EXISTS 
    (SELECT b FROM B b JOIN b.arefs ba WHERE a = ba) 

SELECT a FROM A a WHERE a NOT IN 
    (SELECT ba FROM B b JOIN b.arefs ba) 
2

這是從我的頭頂 - 所以我不知道這是否會工作或爲您的正確解決方案。

添加您在實體關係的另一邊

@Entity class A { 
    int id; 
    String aName; 
    @ManyToOne B bref; 
} 

,那麼你可以創建一個EJB-QL statment到說像「選擇從一個WHERE AB是NULL」

+0

嗯。我會設置一個小測試工具來嘗試這些建議。我在這裏有一個高效的數據庫的工作環境,所以我非常躊躇不決地混淆了數據結構。但是如果沒有其他的工作,我會嘗試。謝謝! – 2011-04-02 07:22:40

+0

我不認爲你需要改變你的底層數據結構。如果將實體A的引用添加到B(manyToOne ref),則可以將加載設置爲「懶惰」,以確保不會從數據庫獲取太多數據。您還可以在@ManyToOne註釋中設置額外的屬性,以指定哪些列定義實體A和B之間的關係。[javadoc](http://download.oracle.com/javaee/6/api/javax/persistence/ManyToOne .html)顯示了這種雙向關係的一個很好的例子 – ChristiaanP 2011-04-02 10:44:48

+0

你甚至不得不改變數據結構嗎?當前的@OneToMany必須存儲在某個位置,無論是在A.B_ID列還是在B_A_REFS中間表中。你不能在A中使用現有的數據庫結構設計一個@ManyToOne字段嗎? – wallenborn 2011-04-02 14:55:32