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


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

查看所有标签

猜你喜欢:

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

Head First HTML与CSS(第2版)

Head First HTML与CSS(第2版)

Elisabeth Robson、Eric Freeman / 徐阳、丁小峰 / 中国电力出版社 / 2013-9 / 98.00元

是不是已经厌倦了那些深奥的HTML书?你可能在抱怨,只有成为专家之后才能读懂那些书。那么,找一本新修订的《Head First HTML与CSS(第2版)》吧,来真正学习HTML。你可能希望学会HTML和CSS来创建你想要的Web页面,从而能与朋友、家人、粉丝和狂热的顾客更有效地交流。你还希望使用最新的HTML5标准,能够保证随时间维护和扩展你的Web页面,使它们在所有浏览器和移动设备中都能正常工......一起来看看 《Head First HTML与CSS(第2版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码