JDO 2.0 最大亮點在於查詢語言 (JDOQL) 的全面增強,解決了 JDO 1.0 僅能回傳候選類別實例、無法彈性投影、缺乏統計彙總等痛點。本文系統整理 JDO 2.0 查詢的新功能。
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 關鍵字去除重複結果組。支援 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() |
將 JDOQL 定義於中繼資料 (XML) 中,以名稱查找:
Query q = pm.newNamedQuery(MyClass.class, "findByName");
便於外部化 SQL、動態調整查詢邏輯無需重編譯。
可直接在查詢過濾條件中使用持久化類別的 public static final 常數:
public static final int MALE = 1;
// Query filter: "gender == MALE"
無需載入物件即可刪除符合條件的所有資料:
query.deletePersistentAll(); // 或帶參數版本
回傳被刪除物件集合 (若不存取則不載入記憶體,效能極佳)。
query.addExtension(key, value) / setExtensions(Map):支援廠商專屬查詢功能。pm.newQuery("javax.jdo.query.SQL", "SELECT * FROM ..."):直接執行 SQL,需自行對應主鍵回傳物件,不支援 JDOQL 函數。JDO 2.0 查詢增強極大提升了彈性與效能,特別是結果投影、統計彙總、批量操作,使 JDO 在複雜報表、大數據處理場景具備與 SQL 同等表達力,同時保持物件導向優勢。