Criteria API / Metamodel

如果編譯器能夠對查詢執行語法正確性進行檢查,那麼對於 Java 物件而言, 該查詢就是類型安全的。

Google Dict - Criteria


JPQL(JPA 1.0+)的缺陷


  1. 查詢語句為一個 String 類型 ...
    1. 表示其 class 能順利的通過 Compiled.
    2. 但不保證 Runtime 時的類型安全, 意即可能發生的是查詢句上的語法錯誤, 導致應用程式產生無法預期的失效.



Criteria API (JPA 2.0+)


使用 Criteria API 開發 Java 編譯器能夠檢查其正確性的查詢,從而減少運行時錯誤,這種查詢優於傳統的基於字符串的 Java Persistence Query Language (JPQL) 查詢。借助使用資料庫函數或匹配模板實例的樣例查詢,程式查詢構造機制的強大威力,並將其與使用預定義語法的 JPQL 查詢進行對比。


import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;


...

    private List<Author> findAuthorEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Author.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }


    public int getAuthorCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Author> rt = cq.from(Author.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }





References



http://www.infoq.com/presentations/whats-new-and-exciting-in-jpa-20
詳解JPA 2.0動態查詢機制:Criteria API(1) http://developer.51cto.com/art/200911/162722.htm
Subpages (1): criteria
Comments