Java持久化查詢語言增強
JPA 1.0定義了一個廣泛的Java持久化查詢語言(非正式簡稱為JPQL。有關JPQL查詢的缺陷,可參考51CTO之前發布的這篇文章),使用它你可以查詢實體和它們的持久化狀態。JPA 2.0對JPQL做了大量改進,如現在可以在查詢中使用case表達式。在下面的查詢中,如果雇員的評分為1,則通過乘以1.1對雇員的薪水進行了增長,如果評分為2,則乘以1.05,其它評分則乘以1.01。
- UPDATE Employee e
- SET e.salary =
- CASE WHEN e.rating = 1 THEN e.salary * 1.1
- WHEN e.rating = 2 THEN e.salary * 1.05
- ELSE e.salary * 1.01
- END
JPA 2.0也為JPQL增加了大量新的運算符,如NULLIF和COALESCE,當數據庫使用其它非空數據解碼時,NULLIF運算符是非常有用的,使用NULLIF,你可以在查詢中將這些值轉換為空值,如果參數等於NULLIF,NULLIF會返回空值,否則返回第一個參數的值。
假設薪水數據保存在employee表中,數據類型為整數,卻掉的薪水解碼為-9999,下面的查詢返回薪水的平均值,為了正確地忽略卻掉的薪水,查詢使用NULLIF將-9999轉換為空值。
- SELECT AVG(NULLIF(e.salary, -99999))
- FROM Employee e
COALESCE運算符接收一串參數,從列表中返回第一個非空值,相當於下面的case表達式:
- CASE WHEN value1 IS NOT NULL THEN value1
- WHEN value2 IS NOT NULL THEN value2
- WHEN value3 IS NOT NULL THEN value3
- ...
- ELSE NULL
- END
假設employee表包括一個辦公電話號碼和家庭電話號碼列,無電話號碼的列使用空值表示。下面的查詢返回每個雇員的姓名和電話號碼,COALESCE運算符指定查詢返回辦公電話號碼,但如果為空,則返回家庭電話號碼,如果兩者都為空,則返回一個空值。
- SELECT Name, COALESCE(e.work_phone, e.home_phone) phone
- FROM Employee e
此外,JPA 2.0增加了選擇列表、以及集合值參數和非多態查詢中運算符的支持。