首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDO 2.0 查詢語言 (JDOQL) 全新特性深度解析

     編輯:Java 相關知識

JDO 2.0 最大亮點在於查詢語言 (JDOQL) 的全面增強,解決了 JDO 1.0 僅能回傳候選類別實例、無法彈性投影、缺乏統計彙總等痛點。本文系統整理 JDO 2.0 查詢的新功能。

彈性結果投影 (Result Specification)

JDO 1.0 查詢結果固定為候選類別實例集合。JDO 2.0 允許指定 Result Expression,回傳任意組合:

  • this:候選類別實例 (相容 1.0)。
  • 欄位路徑:如 address.street.name。
  • 運算式:多欄位算術運算結果。
  • 變數參考:查詢中宣告的中間變數。
  • 統計函數:count(), sum(), avg(), min(), max()。

API:query.setResult("count(this), avg(price)")。

結果封裝與映射

  • 單一結果表達式 → 回傳該型別集合。
  • 多重結果表達式 → 預設回傳 Object[] 集合。
  • 指定 resultClass (需有無參建構子) → 自動映射至對應屬性 (public field 或 setter)。
  • distinct 關鍵字去除重複結果組。

分組與統計 (Grouping / Having)

支援 SQL 風格 GROUP BY / HAVING:

query.setGrouping("department, having avg(salary) > 50000");
query.setResult("department, avg(salary)");

結果表達式必須為分組欄位或其統計運算。

唯一結果與範圍限制

  • query.setUnique(true):宣告預期單一結果,回傳單一物件而非集合;無結果回傳 null,多筆拋出異常。
  • query.setRange(from, to):分頁查詢,回傳子集合 (含 from, 不含 to)。

新增查詢運算子與函數

類別新增項目
型別檢查instanceof 運算子
Map 操作containsKey(o), containsValue(o)
字串處理toLowerCase(), toUpperCase(), indexOf(), substring(), matches(regex)
數學函數Math.abs(), Math.sqrt()

命名查詢 (Named Queries)

將 JDOQL 定義於中繼資料 (XML) 中,以名稱查找:

Query q = pm.newNamedQuery(MyClass.class, "findByName");

便於外部化 SQL、動態調整查詢邏輯無需重編譯。

靜態常數存取

可直接在查詢過濾條件中使用持久化類別的 public static final 常數:

public static final int MALE = 1;
// Query filter: "gender == MALE"

批量刪除 (Deletion by Query)

無需載入物件即可刪除符合條件的所有資料:

query.deletePersistentAll(); // 或帶參數版本

回傳被刪除物件集合 (若不存取則不載入記憶體,效能極佳)。

廠商擴充與原生 SQL

  • query.addExtension(key, value) / setExtensions(Map):支援廠商專屬查詢功能。
  • pm.newQuery("javax.jdo.query.SQL", "SELECT * FROM ..."):直接執行 SQL,需自行對應主鍵回傳物件,不支援 JDOQL 函數。

結語

JDO 2.0 查詢增強極大提升了彈性與效能,特別是結果投影、統計彙總、批量操作,使 JDO 在複雜報表、大數據處理場景具備與 SQL 同等表達力,同時保持物件導向優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved