JPQL

JPQL全稱Java Persistence Query Language

基於首次在EJB2.0中引入的EJB查詢語言(EJB QL),Java持久化查詢語言(JPQL)是一種可移植的查詢語言,旨在以面向對象表達式語言的表達式,將SQL語法和簡單查詢語義綁定在一起·使用這種語言編寫的查詢是可移植的,可以被編譯成所有主流資料庫伺服器上的SQL。

其特徵與原生SQL語句類似,並且完全面向對象,通過類名和屬性訪問,而不是表名和表的屬性。

基本介紹

  • 中文名:JPQL
  • 外文名:JPQL
  • 性質:查詢語言
  • 領域:計算機技術
內容簡介,選擇查詢,聚合查詢,更新查詢,刪除查詢,

內容簡介

JPQL所提供的查詢語法主要分為三類:
  • 查詢用的 SELECT 語法
  • 更新用的 UPDATE 語法
  • 刪除用的 DELETE 語法

SELECT 語法結構由幾個部份組成:
SELECT 子句 FROM 子句 [WHERE 子句] [GROUP BY 子句] [HAVING 子句] [ORDER BY 子句]

一個基本的 SELECT 語句如下所示:
SELECT u.id, u.name FROM User u WHERE u.age > 10 AND u.age < 20

其中User u是個路徑表示(path expression),路徑表示有三種:範圍變數(Range variable)路徑表示、群集成員(Collection member)路徑表示與關聯導覽(Association traversing)表示。User u是範圍變數路徑表示的一個例子,指定查詢的實體為User與別名為u。
一個群集成員路徑表示用來指定物件中的群集成員,例如:
SELECT u FROM User u, IN(u.emails) e WHERE e.address LIKE '%.%@openhome.cc'

其中IN中指定的,就是群集成員路徑表示,而>、<、AND、IN、LIKE等都是WHERE子句中條件表示式,簡單列出一些條件表示式如下:
比較陳述
=、>、>=、<、<=、<>
BETWEEN 陳述
[NOT BETWEEN
LIKE 陳述
[NOT] LIKE
IN 陳述
[NOT] IN
NULL 陳述
IS [NOT] NULL
EMPTY 陳述
IS [NOT] EMPTY
EXISTS 陳述
[NOT] EXISTS

LIKE中,可以用_表示比對單一字元,用%表示比對任意數目字元。
關聯導覽表示則提供SQL語法中JOIN的功能,包括了INNER JOIN、LEFT OUTER JOIN、FETCH等,以下為INNER JOIN的實際例子:
SELECT u FROM User u INNER JOINu.emails e WHERE e.address LIKE '%.%@openhome.cc'

JOIN關鍵字可以省略,上式等同於:
SELECT u FROM User u JOINu.emails e WHERE e.address LIKE '%.%@openhome.cc'

LEFT OUTER JOIN的OUTER關鍵字可以省略,一個例子如下:
SELECT u FROM User u LEFT JOIN u.emails e WHERE e.address LIKE'%.%@openhome.cc'

在作INNER JOIN、LEFT OUTER JOIN可以加上FETCH關鍵字,以預先擷取相關資料,例如:
SELECT u FROM User u LEFT JOIN FETCH u.emails e WHERE e.address LIKE'%.%@openhome.cc'

SELECT中可以使用聚集函式,例如:
SELECT AVG(u.age) FROM User u

SELECT中可以使用建構表示,直接將一些資料封裝為指定的物件,例如:
SELECT NEW SomeObject(u.id, u.name, o.number) FROM User u JOIN Order o WHERE u.id = 1975

WHERE子句中可以使用LENGTH()、LOWER()、UPPER()、SUBSTRING()等JPQL函式。
可以對查詢結果使用ORDER BY進行排序:
SELECT u FROM User u ORDER BY u.age

ORDER預設是ASC昇冪排序,可使用DESC降冪排序:
SELECT u FROM User u ORDER BY u.age DESC

可同時指定兩個以上的排序方式,例如先按照"age"降冪排序,如果"age"相同,則按照"name"昇冪排列:
SELECT u FROM User u ORDER BY u.age DESC, u.name

可以配合GROUP BY子句,自動將指定的欄位依相同的內容群組,例如依欄位"sex"分組並作平均:
SELECT u.sex, AVG(u.age) FROM User u GROUP BY u.sex

GROUP BY通常搭配HAVING來使用,例如:
SELECT u.sex, avg(u.age) FROM User u GROUP BY u.sex HAVING AVG(u.age) > 20

可以使用UPDATE語法來更新資料,例如:
UPDATE User u SET u.name='momor' WHERE u.name='bbb'

可以透過DELETE來刪除資料,例如:
DELETE User u WHERE u.name='bush'

選擇查詢

SELECT <select_expression>
FROM <from_clause>
[WHERE <conditional_expression>]
[ORDER BY <order_by_clause>]

聚合查詢

SELECT <select_expression>
FROM <from_clause>
[WHERE <conditional_expression>]
[GROUP BY <group_by_clause>]
[HAVING <conditional_expression>]
[ORDER BY <order_by_clause>]

更新查詢

UPDATE <entity name>[ [AS ] <identification variable>]
SET <update_statement>{,<update_statement>}*
[WHERE <conditional_expression>]

刪除查詢

DELETE FROM <entity name>[ [AS ] <identification variable>]
[WHERE <conditional_expression>]

相關詞條

熱門詞條

聯絡我們