JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)
Java EE 7已經存在了幾年,它提供了一些非常有用且期待已久的功能,例如實體圖以及對存儲過程和結果映射的更好支持。 有關概述,請參閱Thorben Janssen的博客文章 。 但是,我想添加有關JPA查詢語言功能的更詳細的摘要。 在JPQL和Criteria API中都可以使用它們:
- ON關鍵字為JOIN指定條件
- FUNCTION調用任意數據庫函數
- 處理將實體下調到其特定類型
在本文中,我將重點介紹第一個新增內容。 我將在下一篇文章中添加其他2個。
加入
JPA中的JOIN表達式已經與標準SQL中的JOIN有所不同。 僅當實體之間的映射已經存在時才可以使用JOIN,并且由于使用隱式聯接的相關集合的延遲加載而并非總是必需的。 如果您是JPA的初學者,請小心使用JPA JOIN,并仔細閱讀文檔 。
在JPA 2.1之前,只能使用WHERE子句中的條件過濾最終查詢結果。 在大多數情況下,這就足夠了。 但是,在使用LEFT JOIN時,您遇到了一個極限,并且想要限制從另一個實體中要聯接的對象。 使用LEFT JOIN,您總是總是從第一個實體獲得至少一行,但是有時您不想合并來自另一個實體的任何實例,而使最終集合為空。
除了在Hibernate中使用WITH關鍵字外,在JPA中以前沒有標準的方法可以做到這一點。 從JPA 2.1開始,可以使用ON關鍵字為連接添加條件,類似于SQL JOIN ON。
在JPA中使用JOIN ON的示例
SELECT a FROM Person p LEFT JOIN p.addresses a ON a.city = p.city上面的代碼段將僅檢索與該人具有相同城市的那些地址。 通過將條件移到WHERE中可以實現相同的目的,因此我們需要一個具有多個聯接的更復雜的示例才能看到其優勢:
在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'在上面的示例中,我們僅獲得所在國家/地區,地址和地址存在,并且其人員擁有相同的城市。 使用WHERE有什么區別? 如果最后將ON子句中的兩個條件都放在WHERE中,則將包括與一個人的所有地址相關的所有國家,而不僅包括與同一城市相同的地址。 顯然,僅在最后應用條件時,結果可能會更大。 使用ON關鍵字可以在每次聯接之后過濾結果,從而在每次連續聯接之后得到較小的結果。
但是,即使在將JOIN與ON一起使用時,仍然存在一個限制–實體僅在將它們映射為相關實體時仍然可以聯接。
在Eclipselink中以多個根加入
Eclipselink為標準JPA On關鍵字提供了附加功能。 可以在ON條件下關聯不相關的實體 ,從而可以將不相關的實體加入到查詢中已經存在的其他實體。 因此,即使我們僅需要單個報告的聯接條件,也不希望更新映射,也不需要將字段標記為相關。 同樣,從映射生成數據庫表和約束的測試由于某種原因(例如,如果大量測試數據中可能存在約束違規),也將不希望使用該測試。
這是在Eclipselink中擴展使用ON的示例(JPA 2.1標準中未包括)。 這個人加入了與城市同名的人:
加入多個根實體
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 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓格式化SD卡NTFS(安卓格式化sd
- 下一篇: win10玩不了一梦江湖解决方法(一梦江