JPQL 语言语法

栏目: Java · 发布时间: 7年前

内容简介:JPQL 语言语法

JPQL(Java Persistence Query Language Java 持久化查询语言)和 SQL 之间有很多相似之处 它们之间主要的区别在于前者处理 JPA 实体 而后者则直接涉及关系数据 JPQL 允许我们使用 SELECT UPDATEDELETE 语法定义查询

查询

语法: SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...]

  • FROM 子句:通过声明一个或多个标识符变量来定义查询的范围 并且在 SELECTWHERE 子句中可以引用这些标识符变量
  • WHERE 子句:用于限制查询到的对象或值的条件表达式
  • GROUP BY 子句:根据一组属性对查询结果进行分组
  • HAVING 子句:配合 GROUP BY 子句使用 以根据条件表达式进一步限制查询结果
  • ORDER BY 子句:对查询结果进行排序

部门实体:

@Entity(name = "Department")
public class Department{

 @Id
 @GeneratedValue
 private Long id;

 private String name;

 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
 @JoinColumn(name = "department_id")
 private Set<Employee> employees;

 // getters and setters

}

雇员实体:

@Entity(name = "Employee")
public class Employee{

 @Id
 @GeneratedValue
 private Long id;

 private String name;

 @Enumerated(EnumType.STRING)
 private Sex sex;

 private Integer age;

 private Boolean married;

 private Double salary;

 private Date hireDate;

 @ManyToOne(fetch = FetchType.LAZY)
 private Department department;

 // getters and setters

}

性别枚举:

package org.fanlychie.enums;

public enum Sex {

 MALE("男"),

 FEMALE("女"),

 ;

 private final String displayText;

 private Sex(String displayText){
 this.displayText = displayText;
 }

 @Override
 public String toString(){
 return displayText;
 }

}

基础查询

语法: SELECT 标识符变量 FROM 实体名称 [AS] 标识符变量

示例:查询所有的雇员信息

@Query("SELECT E FROM Employee E")
List<Employee> selectExample();

查询参数

JPQL 支持两种查询参数 它们分别是命名参数和位置参数

命名参数

语法: : + 自定义的参数名称

示例:按性别和薪资范围查找雇员信息

@Query("SELECT E FROM Employee E WHERE E.sex = :sex AND E.salary > :salary")
List<Employee> selectExample(@Param("sex") String sex, @Param("salary") Double salary);

在方法的参数列表中 需要使用 @Param 注解标注每个参数的名称 使之与查询语句参数名称匹配

位置参数

语法: ? + 位置编号的数值

示例:按姓名和性别查找雇员信息

@Query("SELECT E FROM Employee E WHERE E.sex = ?1 AND E.salary > ?2")
List<Employee> selectExample(String sex, Double salary);

在方法的参数列表中 参数的顺序需要与查询语句中参数标注的编号依次对应起来

关联查询

通过使用关键字 [LEFT|INNER] JOIN 联接关系属性查询

单值关联查询

语法: SELECT 标识符变量 FROM 实体名称 [AS] 标识符变量 JOIN 实体名称.单值关联字段 [AS] 标识符变量2 ...

示例:按部门名称查找该部门所有的雇员信息

@Query("SELECT E FROM Employee E JOIN E.department D WHERE D.name = ?1")
List<Employee> selectExample(String deptName);

多值关联查询

语法: SELECT 标识符变量 FROM 实体名称 [AS] 标识符变量 JOIN 实体名称.多值关联字段 [AS] 标识符变量2 ...

示例:查询薪资大于10000的所有雇员所属的部门信息

@Query("SELECT D FROM Department D JOIN D.employees E WHERE E.salary > 10000")
List<Department> selectExample();

或者: SELECT 标识符变量 FROM 实体名称 [AS] 标识符变量, IN(实体名称.多值关联字段) [AS] 标识符变量2 ...

@Query("SELECT D FROM Department D, IN(D.employees) E WHERE E.salary > 10000")
List<Department> selectExample();

去重查询

语法: SELECT DISTINCT 标识符变量 FROM 实体名称 [AS] 标识符变量 ...

示例:查询薪资大于10000的所有雇员所属的部门信息 并消除查询结果中的重复的部门

@Query("SELECT DISTINCT D FROM Department D JOIN D.employees E WHERE E.salary > 10000")
List<Department> selectExample();

字面值

JPQL 支持的字面值有以下的4种:

  • 字符串
  • 数字
  • 布尔
  • 枚举

字符串

语法: '字符串'

示例:查询给定名字的雇员信息

@Query("SELECT E FROM Employee E WHERE E.name = '张三'")
Employee selectExample();

如果字符串中含有单引号 则用两个单引号来表示 如:Li’Si -> Li’’Si

@Query("SELECT E FROM Employee E WHERE E.name = 'Li''Si'")
Employee selectExample();

数字

整数类型:如 24 +24 -24 24L 支持 Java Long 范围的数值

浮点数类型:如 24. 24.6 +24.6 -24.6 24.6F 24.6D 支持 Java Double 范围的数值

示例:查询薪资大于10000的所有雇员

@Query("SELECT E FROM Employee E WHERE E.salary > 10000.0")
List<Employee> selectExample();

布尔

布尔类型的可选值为: TRUEFALSE 它们不区分大小写

示例:查找已婚的所有雇员

@Query("SELECT E FROM Employee E WHERE E.married = TRUE")
List<Employee> selectExample();

枚举

枚举类名必须指定为完全限定类名

示例:查询所有女性的雇员

@Query("SELECT E FROM Employee E WHERE E.sex = org.fanlychie.enums.Sex.FEMALE")
List<Employee> selectExample();

模糊查询

表达式 匹配 不匹配
E.name LIKE ‘张%’ 张三 小张伟
E.name LIKE ‘张_’ 张三 张三丰
E.name LIKE ‘张\_%’ 张_三 张三

示例:查询张性的所有雇员

@Query("SELECT E FROM Employee E WHERE E.name LIKE '张%'")
List<Employee> selectExample();

空集合查询

通过使用关键字 IS [NOT] EMPTY 来查找关联的属性集合的值为空的记录

示例:查找尚无雇员的所有部门

@Query("SELECT D FROM Department D WHERE D.employees IS EMPTY")
List<Department> selectExample();

构造器

查询结果的类型如果不是持久化的实体类 必须使用该类的完全限定名

语法: SELECT NEW 类的完全限定名(参数1, 参数2, ...) ...

示例:查询所有的雇员信息

package org.fanlychie.model;

public class SimpleEmployee{

 private String name;

 private Sex sex;

 public SimpleEmployee(String name, Sex sex){
 this.name = name;
 this.sex = sex;
 }

 // getters and setters
 
}
@Query("SELECT NEW org.fanlychie.model.SimpleEmployee(E.name, E.sex) FROM Employee E")
List<SimpleEmployee> selectExample();

更新

示例:更新某个雇员的婚姻状态和薪资信息

@Modifying
@Transactional
@Query("UPDATE Employee SET married = ?2, salary = ?3 WHERE id = ?1")
int updateExample(Long id, Boolean married, Double salary);

@Query 无法进行 DML (Data Manipulation Language 数据操控语言 主要语句有 INSERT DELETE UPDATE )操作 如需更新数据库表的数据需要标注 @Modifying 注解 并且需要事务的支持 @Transactional

删除

示例:删除没有雇员的部门信息

@Modifying
@Transactional
@Query("DELETE FROM Department D WHERE D.employees IS EMPTY")
int deleteExample();

参考文档:

http://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据分析技术白皮书

数据分析技术白皮书

伍海凤、刘鹏、杨佳静、马师慧Sara、李博、Shirley Song、Zinc、李晓艳 / 2016-8-11 / 0

关于数据分析技术白皮书(Analytics Book 中文版),主要内容围绕: 1. 分析(Analytics):网站分析 & APP分析 2. 谷歌分析工具的原理、部署与使用 3. 开源网站分析工具的原理、部署与使用 4. Log日志分析原理 5. 网站分析的维度与指标定义 6. 如何炼成为一个互联网数据分析师 请访问书的数据分析技术白皮书官网“免费”阅......一起来看看 《数据分析技术白皮书》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具