天天看點

JAVA 持久層三種查詢方式

Java JPA有三種查詢方式:

1)JPQL

2)Criteria API

3)SQL

下面一一詳解。

一、本地SQL查詢

SQL是标準化的查詢語言,用于管理資料。下面的例子說明了怎樣實作本地SQL查詢:

[java]view plaincopyprint?

// 獲得實體管理器

EntityManager em = ...

// 建立SQL查詢

String getByFirstName = "SELECT * FROM contacts c WHERE c.first_name = ?1";

// 建立查詢執行個體

Query query = em.createNativeQuery(getByFirstName, Contact.class);

// 設定查詢參數

query.setParameter(1, "John");

// 擷取結果

List contacts = query.getResultList();

上面的例子告訴我們3件事:

1)用JPA建立查詢,無需學習新的查詢語言;

2)建立的查詢沒有類型安全,在使用前必須計算查詢結果;

3)在運作程式前必須驗證查詢的拼寫或文法是否有錯誤。

而且SQL查詢會指定資料庫的模式,是以除非必要,我們都應該避免使用此方式。

二、JPQL查詢

JPQL是基于字元串的查詢語言,文法類似于SQL。是以學習JPQL相當容易,隻要有一定的SQL基礎。看下面的代碼:

[java]view plaincopyprint?

// 獲得實體管理器

EntityManager em = ...

// 建立JPQL查詢

String getByFirstName = "SELECT c FROM Contact c WHERE c.firstName = :firstName";

// 建立查詢執行個體

TypedQuery<Contact> query = em.createQuery(getByFirstName, Contact.class);

// 設定查詢參數

query.setParameter("firstName", "John");

// www.cdtarena.com擷取結果

List<Contact> contacts = query.getResultList();

上面的例子告訴我們3件事:

1)建立的查詢是類型安全的,我們不必計算查詢的結果;

2)JPQL查詢字元串是易讀、易于了解的;

3)建立的查詢字元串在編譯期間不會被驗證。

JPQL對于靜态查詢是一個好辦法。換句話說們,如果很多查詢參數總是相同的,那麼JPQL是我們的首選。但是,JPQL實作動态查詢就顯得很繁瑣了。

三、Criteria API

Criteria API用于解決對接第三方ORM架構時讓JPQL标準化。它用于建構查詢定義對象,此對象會被翻譯成可執行的SQL查詢。下面的代碼說明了這個問題:

[java]view plaincopyprint?

// 獲得實體管理器

EntityManager em = ...

// 獲得Criteria建立器

CriteriaBuilder cb = em.getCriteriaBuilder();

// 建立Criteria查詢

CriteriaQuery<Contact> query = cb.greateQuery(Contact.class);

// 建立查詢Root

Root<Contact> root = query.from(Contact.class);

// 建立firstName的查詢條件,使用靜态元模型

Predicate firstNameIs = cb.equal(root.get(Contact_.firstName, "John"));

// 指定查詢的where條件

query.where(firstNameIs);

// 建立查詢并擷取結果

TypedQuery<Contact> q = em.createQuery(query);

List<Contact> contacts = q.getResultList();

上面的例子告訴我們3件事:

1)建立的查詢是類型安全的,不必計算查詢的結果;

2)代碼不如SQL或JPQL那麼易讀;

3)由于是使用Java API處理,Java編譯器會確定查詢的文法正确。

Criteria API對于建立動态查詢是一個極好的工具。它使得建立動态查詢更簡便,因為我們處理的是對象,而不是處理查詢的字元串。缺點在于随着查詢的複雜度的增加,,查詢定義對象的建立也會變得很繁瑣,代碼會更難讀

上一篇: 轉載,侵删