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

JDO 2.0 查詢語言 (JDOQL) 重大增強:結果定義、分組統計、批量刪除與 SQL 直通

     編輯:Java 程式設計入門

核心突破:查詢結果完全可控

JDO 1.0 僅能返回候選類實例集合。JDO 2.0 引入 Result Specification(結果定義),支援任意組合:

  • 候選類/引用類的單一或多個欄位
  • 非候選類的物件實例
  • 統計函數結果(count、sum、min、max、avg)
  • 上述任意混合

結果表達式語法

// 單一表達式
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 筆

分組操作:GROUP BY / HAVING

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");

批量刪除:Delete by Query

// 直接刪除符合條件的所有物件,不載入記憶體
Object deleted = query.deletePersistentAll(); // 或帶參數版本
// 返回被刪除物件集合(若不訪問則不實例化,效能最優)

廠商擴展機制

query.addExtension("vendor-specific-hint", "value");
query.setExtensions(mapOfExtensions);

SQL 直通通道

當 JDOQL 無法表達複雜查詢且滿足:

  1. 運行於關聯式資料庫
  2. 有對應 SQL
  3. 清楚類→表映射細節

可建立 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 市場先機。

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