JPQL主要用于JPA查询数据,和SQL语句的语法大同小异; 最基本的查询: SELECT p FROM Player p 查询出所有的player,包括其子类,也可以写成这样 From Player as p 去除重复的元素 SELECT DISTINCT p FROM Player p WHERE p.position = ?1 关键字DISTINCT去 除了重复的元素,并且接受参数设置条件过滤 结合查询关联 SELECT DISTINCT p FROM Player p, IN(p.teams) t 查询所有有team的player 也可以写成如下: SELECT DISTINCT p FROM Player p JOIN p.teams t 或者: SELECT DISTINCT p FROM Player p WHERE p.team IS NOT EMPTY 关联关系的查询过滤 SELECT t FROM Team t JOIN t.league l WHERE l.sport = ’soccer’ OR l.sport =’football’ 查询所有league sports属性的team对象 SELECT DISTINCT p FROM Player p, IN (p.teams) t WHERE t.league.sport = :sport 其他的查询表达式 LIKE: SELECT p FROM Player p WHERE p.name LIKE ’Mich%’ IS NULL: SELECT t FROM Team t WHERE t.league IS NULL IS EMPTY: SELECT p FROM Player p WHERE p.teams IS EMPTY 主要用于判断关系实体一对多集合 BETWEEN SELECT DISTINCT p FROM Player p WHERE p.salary BETWEEN :lowerSalary AND :higherSalary 等价于: p.salary >= :lowerSalary AND p.salary <= :higherSalary 在 判断日期范围的时候尤其有用; 复 合条件: SELECT DISTINCT p1 FROM Player p1, Player p2 WHERE p1.salary > p2.salary AND p2.name = :name 查找薪水比指定姓名的员工更高的 员工 IN: o.country IN (’UK’, ’US’, ’France’) 同时你也可以在In语句中设置参数: o.country IN (’UK’, ’US’, ’France’, :country) 子 查询: SELECT c FROM Customer c WHERE (SELECT COUNT(o) FROM c.orders o) > 10 EXISTS子查询: SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ( SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp = emp.spouse) ALL和ANY配合=<>=>使用 SELECT emp FROM Employee emp WHERE emp.salary > ALL ( SELECT m.salary FROM Manager m WHERE m.department = emp.department) 其他函数:
算法函数:
返回参数: 1)实体对象 SELECT t FROM Player p, IN (p.teams) t 2) Objecth或者Object[] SELECT c.name, c.country.name FROM customer c WHERE c.lastname = ’Coss’ AND c.firstname = ’Roxane’ 返回一个Object[] list,[0]为name,[1]为country name Select语句的聚合函数:
如: SELECT COUNT(l.price) FROM Order o JOIN o.lineItems l JOIN o.customer c WHERE c.lastname = ’Incandenza’ AND c.firstname = ’Hal’ 构造语句: SELECT NEW com.xyz.CustomerDetail(c.name, c.country.name) FROM customer c WHERE c.lastname = ’Coss’ AND c.firstname = ’Roxane’ 能够利用查出的数据直接构造出对象 Order By: SELECT p.product_name FROM Order o, IN(o.lineItems) l JOIN o.customer c WHERE c.lastname = ’Faehmel’ AND c.firstname = ’Robert’ ORDER BY o.quantity GROUP BY: SELECT c.country, COUNT(c) FROM Customer c GROUP BY c.country Having: SELECT c.status, AVG(o.totalPrice) FROM Order o JOIN o.customer c GROUP BY c.status HAVING c.status IN (1, 2, 3) |