百度百科:

JPQL全称Java Persistence Query Language

基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。

其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

内容简介

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>]