JDO 1.0 僅能返回候選類實例集合。JDO 2.0 引入 Result Specification(結果定義),支援任意組合:
// 單一表達式
query.setResult("count(this)");
// 多表達式(返回 Object[])
query.setResult("contactId, name, age");
// 別名映射到 Result Class
query.setResult("contactId as id, name as fullName, age");
query.setResultClass(ContactSummary.class); // 需無參建構子 + 對應 setter/欄位
| 函數 | 參數 | 說明 |
|---|---|---|
| count | 表達式(可為 this) | 計數 |
| sum/min/max/avg | 數值型欄位表達式 | 聚合運算 |
query.setResult("distinct name, age"); // 去重
query.setRange(0, 10); // 分頁:第 0-9 筆
query.setGrouping("department, having avg(salary) > 50000");
// 結果表達式必須為 grouping 項或其統計運算
groupSpec:逗號分隔的分組表達式 + 可選 having 子句having 可包含布林判斷或統計函數query.setUnique(true); // 確定單筆結果
Object result = query.execute(); // 直接返回單一物件,非 Collection
// 無結果 → null;多筆 → 拋出異常
解決 JDO 1.0 execute() 僅返回 Object(實為 Collection)的不便。
| 類別 | 新增項目 |
|---|---|
| 型別判斷 | instanceof 運算子 |
| Map 操作 | containsKey(obj)、containsValue(obj) |
| 字串函數 | toLowerCase()、toUpperCase()、indexOf()、substring()、matches(pattern) |
| 數學函數 | Math.abs()、Math.sqrt() |
matches 支援有限正則:.、.* 通配符、(?i) 忽略大小寫。
在 JDO 元資料(.jdo 檔)中聲明常用查詢,運行時由名稱獲取:
Query q = pm.newNamedQuery(Contact.class, "findByName");
優勢:查詢語句外部化,修改無需重編譯 Java 代碼。
// 領域類
public class Gender { public static final int MALE = 1; public static final int FEMALE = 0; }
// 查詢過濾條件
query.setFilter("salary > 5000 && gender == Gender.MALE");
// 直接刪除符合條件的所有物件,不載入記憶體
Object deleted = query.deletePersistentAll(); // 或帶參數版本
// 返回被刪除物件集合(若不訪問則不實例化,效能最優)
query.addExtension("vendor-specific-hint", "value");
query.setExtensions(mapOfExtensions);
當 JDOQL 無法表達複雜查詢且滿足:
可建立 SQL 查詢:
Query q = pm.newQuery("javax.jdo.query.SQL",
"SELECT id FROM contacts WHERE name = ?");
q.execute("John"); // 參數以 ? 佔位,按序綁定
限制:不可使用 JDOQL 函數、過濾器、排序聲明;返回類實例需查詢主鍵欄位。
JDO 2.0 將 JDOQL 從「單一返回類型」提升為「任意結果組合、分組統計、批量操作、SQL 互通」的完整查詢語言。配合脫離/附著機制與標準 ORM 映射,JDO 成為物件導向資料存取的強有力標準。廠商可優先實作查詢增強模組,搶佔 JDO 2.0 市場先機。