jpa root.join_JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)
jpa root.join
Java EE 7已經(jīng)存在了幾年,并且提供了一些非常有用且期待已久的功能,例如實(shí)體圖以及對存儲過程和結(jié)果映射的更好支持。 有關(guān)概述,請參閱Thorben Janssen的博客文章 。 但是,我想添加有關(guān)JPA查詢語言功能的更詳細(xì)的摘要。 JPQL和Criteria API中都提供了它們:
- ON關(guān)鍵字為JOIN指定條件
- FUNCTION調(diào)用任意數(shù)據(jù)庫函數(shù)
- 處理將實(shí)體下調(diào)到其特定類型
在本文中,我將重點(diǎn)介紹第一個新增內(nèi)容。 我將在下一篇文章中添加其他2個。
加入
JPA中的JOIN表達(dá)式已經(jīng)與標(biāo)準(zhǔn)SQL中的JOIN有所不同。 僅當(dāng)實(shí)體之間的映射已經(jīng)存在時才可以使用JOIN,并且由于使用隱式聯(lián)接的相關(guān)集合的延遲加載而并非總是必需的。 如果您是JPA的初學(xué)者,請小心使用JPA JOIN,并仔細(xì)閱讀文檔 。
在JPA 2.1之前,只能使用WHERE子句中的條件過濾最終查詢結(jié)果。 在大多數(shù)情況下,這就足夠了。 但是,在使用LEFT JOIN時,您遇到了一個極限,并且您想限制將要從另一個實(shí)體聯(lián)接的對象。 使用LEFT JOIN,您總是總是從第一個實(shí)體獲得至少一行,但是有時您不想合并來自另一個實(shí)體的任何實(shí)例,而使最終集合為空。
除了Hibernate中的WITH關(guān)鍵字之外,在JPA中,過去沒有標(biāo)準(zhǔn)的方法可以做到這一點(diǎn)。 從JPA 2.1開始,可以使用ON關(guān)鍵字為連接添加條件,類似于SQL JOIN ON。
在JPA中使用JOIN ON的示例
SELECT a FROM Person p LEFT JOIN p.addresses a ON a.city = p.city上面的代碼段將僅檢索與該人具有相同城市的那些地址。 通過將條件移到WHERE中可以實(shí)現(xiàn)相同的目的,因此我們需要一個具有多個聯(lián)接的更復(fù)雜的示例才能看到其優(yōu)勢:
在JPA中使用JOIN ON的示例
SELECT c FROM Person p LEFT JOIN p.addresses a ON a.city = p.city LEFT JOIN a.country c ON c.region = 'Europe'在上面的示例中,我們僅獲得所在國家/地區(qū),地址和地址均存在,并且其人員所在的城市相同。 使用WHERE有什么區(qū)別? 如果最后將ON子句中的兩個條件都放在WHERE中,則將包括與一個人的所有地址相關(guān)的所有國家,而不僅包括與同一城市相同的地址。 顯然,僅在最后應(yīng)用條件時,結(jié)果可能會更大。 使用ON關(guān)鍵字可以在每次聯(lián)接之后過濾結(jié)果,從而在每次連續(xù)聯(lián)接之后得到較小的結(jié)果。
但是,即使在將JOIN與ON一起使用時,仍然存在一個限制–實(shí)體僅在將它們映射為相關(guān)實(shí)體時仍然可以聯(lián)接。
在Eclipselink中以多個根加入
Eclipselink為標(biāo)準(zhǔn)JPA On關(guān)鍵字提供了附加功能。 可以在ON條件下關(guān)聯(lián)不相關(guān)的實(shí)體 ,從而可以將不相關(guān)的實(shí)體與查詢中已經(jīng)存在的其他實(shí)體關(guān)聯(lián)。 因此,即使我們僅需要單個報告的聯(lián)接條件,也不希望更新映射,也不需要將字段標(biāo)記為相關(guān)。 同樣,從映射生成數(shù)據(jù)庫表和約束的測試由于某種原因(例如,如果大量測試數(shù)據(jù)中可能存在約束違規(guī)),也將不希望使用該測試。
這是在Eclipselink中擴(kuò)展使用ON的示例(JPA 2.1標(biāo)準(zhǔn)未包含)。 這個人加入了與城市同名的人:
加入多個根實(shí)體
SELECT p FROM Person p LEFT JOIN Person p2 ON p2.city = p.city翻譯自: https://www.javacodegeeks.com/2016/02/jpql-enhancements-jpa-2-1-java-ee-7-part-1-join.html
jpa root.join
總結(jié)
以上是生活随笔為你收集整理的jpa root.join_JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信语音怎么导出电脑保存微信如何导出电脑
- 下一篇: qt4.8创建.pri_注意Java 8