JPQL

什麼是JPQL?
    JPQL的全稱是“Java Persistence Query Language”,即Java持久性查詢語言。JPQL是一種簡單的類似於SQL的基於字符串的語言,用於查詢實體,以及實體間的關係。JPQL簡單、可讀性強,允許編寫可移植的查詢,不必考慮底層數據存儲。JPQL語法與SQL很相似。
語法:
select_clause 返回的結果,可以是一個對象/值的類型
from_clause   範圍,可以使用一個或多個變量輔助說明
[where_clause]
[group by_clause]
[having_clause] 
[order by_clause]
示例:
select c from Customer c
select c.name from Customer c
select count(c) from Customer c
特殊的例子(高級用法):  
    背景 一個老師有多個學生,一個學生一個老師
1.查詢結果返回一個新的對象:  
    select new IDCard(s.id,s.name) from Student s;
2.多對一的查詢(通過多獲取一):
    查詢所有老師是張三,且年齡大於18的學生
    select s.teacher from Student s 
        where s.teacher.name = '張三' and 
                   s.age>18;
3.一對多的查詢(通過一方的集合,查詢特定的一方):
    查詢所有教了包括18歲學生的老師
     select t from Teacher t,  in(t.stuList) [as] s
        由於t中的stu是集合,我們不能直接對其進行條件查詢,因此使用in
        in(CollectionName) [as] identificationVariable
        where s.age = 18;
連接查詢:
JPQL只支持內連接和左外連接。
內連接:[inner] join path_expression [as]  identification_variable
左外:left [outer] join path_expression [as] identification_variable
JPQL將SQL中的join table不支持on,查詢的條件寫到了where子句中
一般情況下,我們對兩個集合(像表一樣) 進行連接。
例如上面的例3,查詢所有教了18歲學生的老師,等價查詢爲:
    select t from Teacher t 
            join(t.stuList) s
                  where s.age = 18;
----------------------------------------------------------------------------------------------------------
執行查詢的接口
   JPA使用javax.persistence.Query接口執行查詢實例,Query實例的查詢交由EntityManager構建相應的查詢語句。該接口擁有多個執行數據查詢的接口方法:
     》Object getSingleResult():執行SELECT查詢語句,並返回一個結果;
     》List getResultList():執行SELECT查詢語句,並返回多個結果;
     》Query setParameter(int position, Object value):通過參數位置號綁定查詢語句中的參數,如果查詢語句使用了命令參數,則可以使用Query setParameter(String name, Object value)方法綁定命名參數
    
    》int executeUpdate():執行新增、刪除或更新操作。

--------------------------------------------------------------------------------------------------------
執行JPQL查詢的步驟
    1. 使用注入或通過 EntityManagerFactory 實例獲取一個 EntityManager 實例。
    2. 通過調用相應 EntityManager 的createQuery方法,創建一個 Query 實例。
    3. 如果有查詢參數,使用相應 Query 的 setParameter 方法進行設置。
    4. 如果需要,使用 setMaxResults 和/或 setFirstResult Query 的方法設置要檢索的實例的最大數量和/或指定檢索的起始實例位置。
    5. 如果需要,使用 setHint Query 的方法設置供應商特定的提示。
    6. 如果需要,使用 setFlushMode Query 的方法設置查詢執行的刷新模式,覆蓋實體管理器的刷新模式。
    7. 使用相應 Query 的方法 getSingleResult 或 getResultList 執行查詢。如果進行更新或刪除操作,必須使用 executeUpdate 方法,它返回已更新或刪除的實體實例的數量。

查詢參數的定義
在JPQL中,查詢參數可以分爲位置參數和命名參數。位置參數的定義是通過問號(?)加位置來定義。命名參數是通過冒號(:)加參數名來定義。用query的setParameter方法填充其值。

使用位置參數如下所示:
Query query = em.createQuery(“select p from Person p where p.id=?1”);
query.setParameter(1, 5311); 
使用命名參數如下所示:
Query query = em.createQuery(“select p from Person p where p.id=
id”);
query.setParameter(“id”, 5311); 


刪除和更新 
顧客的年齡增加一歲。
String updateQL = "update Customer c set c.age = c.age +1";
Query updateQuery = em.CreateQuery(updateQL);
updateQuery.executeUpdate();
刪除id爲空的顧客。
String deleteQL = "delete from Customer c where c.id is null";
Query deleteQuery = em.CreateQuery(deleteQL);
deleteQuery.executeUpdate();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章