查詢是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();
注意:
u 自定義對象必須爲POJO類,提供必要的構造函數;
u JPQL語句中要加NEW關鍵子,且類爲全限定名;
在查詢時,往往需要動態傳入多個條件,此時需要組裝JPQL。在組裝JPQL時,有一個小技巧,可以巧妙利用”1=1”這個表達式,如下
SELECT s FROM Student s WHERE 1=1 AND s.id=:id AND s.name=:name
當增加查詢條件時,只需要增加“AND查詢條件即可”,無需做額外的邏輯判斷。