JPA Query


查詢是JPA中重要的內容,JPA中可以執行兩種方式的查詢,一種是使用JPQL,一種是使用NativeSQL。其中JPQL是基於Entity對象的查詢,可以消除不同數據庫SQL語句的差異;本地SQL是基於傳統的SQL查詢,是對JPQL查詢的補充。

JPA中執行查詢的步驟如下:

1)     編寫查詢語句

SELECT s FROM Student s

2)     創建查詢

通過EntityManager提供的createQuery來創建Query查詢對象;Query對象可以爲JPQL查詢、命名查詢和本地查詢,如下

Queryquery=EntityManager.createQuery(jpql);

命名查詢是一種優化的查詢方式,將所要查詢的JPQL語句在加載階段預編譯,可以提高查詢的效率,類似於JDBC中的PreparedStatement對象。命名查詢最重要的是首先定義查詢,JPA使用@NamedQuery註解來定義命名查詢,如下

@NamedQuery(

  name=”findCustomByName”,

  query=”SELECT s FROM Student WHEREs.name=:name”

)

然後通過EntityManager來獲創建命名參數,如下

Queryquery=entityManager.createNamedQuery(“findCustomByName”);

注意:

l   必須在實體類上定義命名查詢

l   命名查詢作用範圍爲整個持久化單元

3)     設置查詢參數

JPA提供兩種方式設置查詢參數:一種是使用名稱標識參數(以:開頭,後面緊跟參數名,參數名不區分大小寫);另一種是使用位置標識參數(以?開頭,隨後緊跟整數,表示參數的位置),如下

Stringjpql=SELECT s FROM Student s WHERE s.name=:name

Queryquery=entityManaer.createQuery(jpql);

query.setParameter(“name”,”ssl”);

//位置參數

Stringjpql=SELECT s FROM Student s WHERE s.name=?1

Queryquery=entityManaer.createQuery(jpql);

query.setParameter(1,”ssl”);

4)     設置分頁參數

對於大量結果的查詢,往往需要分頁查詢,可以設置分頁查詢的參數,如下

query.setFirstResult(start);

query.setMaxResults(num);

5)     執行查詢

query.getResultList()

query.getSingleResult();查詢結果只有一個,如統計count(*)等

query.executeUpdate();執行更新或刪除操作

6)     查詢結果

查詢的結果可能有一些幾種類型:

l  實體類型、實體集合類

l  Java基本數據類型,如Long、String等

當查詢結果唯一時,且查詢的不是實體,此時JPA將會按照所查詢的內容返回對應的數據類型,如下查詢記錄總數:

String jpql=”SELECT COUNT(s) FROM Student s”;

Query query=entityManager.createQuery(jpql);

Long total=(Long)query.getSingleResult();

l  Object[]數組集合

當所要查詢的結果不是實體列表,而是有選擇的查詢表中的幾列書庫,此時執行查詢後,返回的List集合對象中,每個元素是一個Object[]數組對象,如下

String jpql=”SELECT s.id,s.name FROM Student s”;

Query query=entityManager.createQuery(jpql);

List result=query.getResultList();

l  自定義類型

對於複雜的查詢,使用Object[]數組對象的方式容易出錯,JPA提供了更加方便的處理機制,它能夠將查詢的結果自動加載到指定的POJO類中,如下

public StudentDTO implements Serializable

{

  id;

  name;

  …

}

String jpql=”SELECT NEW com.ssl.dto.StudentDTO(s.id,s.name)FROM Student s”;

Query query=entityManager.createQuery(jpql);

List <StudentDTO>result=query.getResultList();

注意:

自定義對象必須爲POJO類,提供必要的構造函數;

JPQL語句中要加NEW關鍵子,且類爲全限定名;

在查詢時,往往需要動態傳入多個條件,此時需要組裝JPQL。在組裝JPQL時,有一個小技巧,可以巧妙利用”1=1”這個表達式,如下

SELECT s FROM Student s WHERE 1=1 AND s.id=:id AND s.name=:name

當增加查詢條件時,只需要增加“AND查詢條件即可”,無需做額外的邏輯判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章