JPQL 的基本使用
一、概念
JPQL 语言,即 Java Persistence Query Language 的简称。JPQL 和 HQL 是非常类似的,支持以面向对象的方式来写 SQL 语句,当然也支持本地的 SQL 语句。JPQL 最终会被编译成针对不同底层数据库的 SQL 查询从而屏蔽掉不同数据库的差异。
1、API
javax.persistence.Query 接口封装了执行数据查询的相关方法。主要方法如下:
- int executeUpdate():用于执行 update 或 delete 语句。
- List getResult():用于执行 select 语句并返回结果集实体列表。
- Object getSingleResult():用于执行返回单个结果实体的 select 语句。
- Query setFirstResult(int startPosition):用于设置从指定行数返回查询结果。
- Query setMaxResults(int maxResult):用于设置结果实体的最大数目。
- setParameter(int position, Object value):为查询语句的指定位置参数赋值。下标从 1 开始。
二、用法实例
-
查询:
package test.java; import com.yunche.helloworld.Customer; import com.yunche.helloworld.Order; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.persistence.*; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @ClassName: MappingTest * @Description: 测试类 * @author: yunche * @date: 2019/01/18 */ public class MappingTest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction transaction; @Before public void init() { entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1"); entityManager = entityManagerFactory.createEntityManager(); transaction = entityManager.getTransaction(); transaction.begin(); } @After public void destroy() { transaction.commit(); entityManager.close(); entityManagerFactory.close(); } @Test public void testSelectJPQL() { String jpql = "FROM Customer WHERE id = ?1"; Query query = entityManager.createQuery(jpql); query.setParameter(1, 1); Customer customer = (Customer) query.getSingleResult(); System.out.println(customer.getName()); } }
-
修改:
@Test public void testUpdateJPQL() { String jpql = "UPDATE Customer SET name=?1 WHERE id=?2"; Query query = entityManager.createQuery(jpql); query.setParameter(1, "Bob").setParameter(2, 1); // 返回受影响的行数 System.out.println(query.executeUpdate()); }
-
添加(没有 INSERT):
/** * 试了下, JPQL 中没有 INSERT 这个测试用例是通不过的 * 可能为了让们我尽量使用 EntityManager 中的 persist() 方法吧,也是 JPA 毕竟提倡我们少写 SQL */ @Test public void testInsertJPQL() { String jpql = "INSERT INTO Customer(name, email, age) VALUES(?1, ?2, ?3)"; Query query = entityManager.createQuery(jpql); query.setParameter(1, "Mike").setParameter(2, "Mike@163.com").setParameter(3, 20); System.out.println(query.executeUpdate()); }
-
删除:
@Test public void testDeleteJPQL() { String jpql = "DELETE FROM Customer WHERE id = ?1"; Query query = entityManager.createQuery(jpql); query.setParameter(1, 1); System.out.println(query.executeUpdate()); }
不积跬步,无以至千里;不积小流,无以成江海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!