2014-10-10 43 views
4

如何在JPQL中評估實體比較(相等)語句:是通過身份比較還是通過equals()或其他?實體比較如何在JPQL WHERE子句中起作用?

我花了幾個小時的谷歌搜索和通過Hibernate和JPA的規格,但仍然無法找到它的工作原理。考慮下面的實體:

class MyProductType{Integer id;} 
class MyProduct{Integer id; MyProductType pType;} 

而且現在的JPQL/HQL查詢:

SELECT t FROM MyProductType t, MyProduct p WHERE p.pType = t 

(我知道這是一個醜陋的查詢,只專注於在where子句語義)

那麼如何是p.pType = t評估?

JSR 317提到了「entity_expression」比較,但它的行爲沒有闡明。

編輯:我不喜歡Rika的建議下面是.id方法包括隱式內部聯接,通常不是你想要的情況下查詢使用外(左)連接。

+0

查詢是否有效?我之所以問這個問題,是因爲通常會看到p.pType.id = t.id或其他類似的東西。因爲您仍然從數據庫中查詢,並且數據庫本身不在對象中。 – Rika 2014-10-10 13:40:53

+0

這是一個簡化的示例查詢。我目前的實際情況要複雜得多。但是,它適用於實體比較。問題在於它是如何工作的(JPA是否按照您所描述的那樣進行了id比較,或者它對實體使用了equals())。我想弄清楚的是,我能否依靠簡短的語法,或者我不得不按照你的建議去做完整的ID聲明。 – sierre 2014-10-10 13:48:25

回答

3

我發現這在http://www.objectdb.com/java/jpa/query/jpql/comparison,這是非常有趣,很好的問題。用戶定義的類(實體類和可嵌入 班)的

實例可以通過使用相等運算符(=,<>,==, !=)進行比較。對於實體,如果e1和e2具有相同的主鍵值和 相同的主鍵值,則e1 = e2。對於可嵌入對象,如果e1和e2 具有完全相同的內容,則e1 = e2。

因此,它似乎檢查對象的主鍵值和對象的類型。因此,似乎用p.pType = t,它會檢查(假設id是主鍵)p.pType的id,id爲t並查看它們是否相等。然後它將檢查兩個實體是否具有相同類型或MyProductType。

+0

我也發現了。但是它一般用於ObjectDB而不是JPA。感謝您的評論。 在用Hibernate進行一些調試後,我發現實體比較轉換爲與JPQL中的.id比較完全相同的SQL。所以我想我會標記你的答案,如果沒有其他人在幾天內接受。 – sierre 2014-10-10 15:24:00

0

我在使用EclipseLink和MySQL DB的NetBeans環境中做了同樣的事情。生成的SQL語句與外鍵一起工作(在類的表中引用另一個類的對象)以及引用對象的主鍵值。