JPA 1.0 (JSR-220) 引入 JPQL,但查詢以**字符串**形式構建:
弱類型 → 編譯期無法檢查、IDE 難以補全/重構、運行時才發現拼寫錯誤。
Linda DeMichiel 主導,核心思想:**用對象圖構建查詢語義樹**。
// 概念示例
CriteriaQuery cq = cb.createQuery(Customer.class);
Root c = cq.from(Customer.class);
cq.select(c).where(cb.equal(c.get("name"), "John"));
List result = em.createQuery(cq).getResultList();
CriteriaBuilder 工廠創建條件/表達式/順序/分組對象。Metamodel 類型 (Customer_) 提供屬性引用類型安全 (Customer_.name)。javax.annotation.Processor,編譯期掃描實體註解,**自動生成強類型 Metamodel 類** (Customer_ 包含 SingularAttribute name 等)。cb.equal(c.get(Customer_.name), "John") —— 屬性重命名編譯報錯。javac,Hibernate 團隊積極推動納入標準。jsr-317-pdr-feedback@sun.com。Specification/JpaSpecificationExecutor 封裝 Criteria,進一步降低使用門檻。**類型安全查詢** 是 ORM 進化關鍵:從字符串拼接 → 對象圖構建 → 編譯期元模型驗證。這場爭論直接塑造了後十年 Java 持久層開發體驗。