JPQL查询语言入门指南
Java Persistence Query Language(JPQL)是一种允许我们编写基于字符串的查询语言。JPQL的语法与标准SQL非常相似,但它是底层原生查询的抽象,这就是为什么它是可移植的,并且可以适用于任何支持的数据存储。在本篇入门示例中,我们将看到如何使用SELECT … FROM … WHERE …查询。SELECT、FROM和WHERE是JPQL的关键字,与相应的SQL关键字具有相似的用途。
实体定义
首先,我们需要定义一个实体类。以下是一个Employee
类的示例:
@Entity
public class Employee {
@Id
private long id;
private String name;
private String dept;
// 省略其他字段和方法
}
使用查询
接下来,我们将使用JPQL查询来操作这个实体。以下是一个示例主类ExampleMain
,它演示了如何使用JPQL查询:
public class ExampleMain {
private static EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory("example-unit");
public static void main(String[] args) {
try {
persistEmployees();
findEmployeesByDept("IT");
} finally {
entityManagerFactory.close();
}
}
public static void persistEmployees() {
// 省略员工数据的创建和持久化代码
}
private static void findEmployeesByDept(String dept) {
EntityManager em = entityManagerFactory.createEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.dept = :deptName");
query.setParameter("deptName", dept);
List<Employee> resultList = query.getResultList();
resultList.forEach(System.out::println);
em.close();
}
}
在上面的查询中,FROM关键字后面的名称不是表名,而是实体的名称。默认情况下,实体名称与其类的简单名称相同。例如,如果我们使用@Entity(name = "Emp")
,则查询语句将是:SELECT e FROM Emp e WHERE ...
。
使用位置参数
除了使用命名参数外,我们还可以通过位置参数来绑定参数值:
public class ExampleMain2 {
// 省略EntityManagerFactory的创建和关闭代码
public static void persistEmployees() {
// 省略员工数据的创建和持久化代码
}
private static void findEmployeesByDept(String dept) {
EntityManager em = entityManagerFactory.createEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.dept = ?1");
query.setParameter(1, dept);
List<Employee> resultList = query.getResultList();
resultList.forEach(System.out::println);
em.close();
}
}
示例项目
以下是本示例项目使用的一些依赖和技术:
- h2 1.4.197: H2数据库引擎。
- hibernate-core 5.2.13.Final: Hibernate提供的O/RM核心功能。
- JDK 1.8
- Maven 3.3.9
通过本篇博客,我们学习了JPQL的基本用法,包括如何定义实体、执行查询以及如何使用命名参数和位置参数。希望这能帮助你更好地理解并使用JPQL。