(四)JPA - JQPL 实现增删改查
(一)JPA的快速入门
建议在需要使用时,看看之前的文章,先把环境搭起来。
5、JPQL
JPQL和SQL
- 1.JPQL和SQL很像,查询关键字都是一样的
- 2.唯一的区别是:JPQL是面向对象的
JPQL书写规则:
JPA的查询语言,类似于sql
- 1.里面不能出现表名,列名,只能出现java的类名,属性名,区分大小写
- 2.出现的sql关键字是一样的意思,关键字不区分大小写
- 3.不能写select * 要写select 别名
示例:
SELECT 子句 FROM 子句 [WHERE 子句] [GROUP BY子句][HAVING子句] [ORDER BY子句]
JPQL的语法结构非常类似于SQL,主要的目的是帮助开发者简化技术学习的成本,如果要想使用JPQL查询操作,则要通过EntityManager接口获取查询实例。

在JPA里面考虑到实际查询之中所可能产生的各种繁琐的查询操作问题,也支持原生SQL命令的,同时要使用JPQL查询主要依靠两个接口:Query、TypedQuery,使用TypedQuery可以直接获取到指定类型的查询结果。
一定注意 所有JPQL语句中的 不是表名 而是对应的实体类名
5、1 查询所有
测试类:
public static Logger loggerFactory = LoggerFactory.getLogger(TestCourseQuery.class);@Testpublic void testSelectAll() {EntityManager entityManager = JPAEntityFactory.getEntityManager();// Course不是表名称 而是对应的实体类名String jpql = "select c from Course as c";// JPQL 查询语句Query query = entityManager.createQuery(jpql);// 发出最终查询语句List<Course> list = query.getResultList();for (Course course : list) {loggerFactory.info("【查询结果:】 {}", course);}// 关闭连接JPAEntityFactory.close();}
查询结果:
【查询结果:】 Course(cid=1, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)
【查询结果:】 Course(cid=3, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)
【查询结果:】 Course(cid=4, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)
5、2 查询指定id
TypedQuery createQuery(String var1, Class var2);
var1:需执行的JPQL语句
var2:实体类的Class
TypedQuery: 解决Query需要进行类型转换的问题
测试类:
@Testpublic void testSelectById() {EntityManager entityManager = JPAEntityFactory.getEntityManager();// Course不是表名称 而是对应的实体类名String jpql = "select c from Course as c where c.cid = ?1";// JPQL 查询语句TypedQuery<Course> query = entityManager.createQuery(jpql, Course.class);query.setParameter(1, 1);// 需要进行强转Course course = query.getSingleResult();loggerFactory.info("【查询结果:】 {}", course);// 关闭连接JPAEntityFactory.close();}
查询结果:
执行的sql: select c1_0.cid,c1_0.cname,c1_0.credit,c1_0.end,c1_0.num,c1_0.start from course c1_0 where c1_0.cid=?
【查询结果:】 Course(cid=1, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)
5、3 分页模糊查询
如果执行发现报错,仔细查看输出日志
@Testpublic void testSelectSplit() {EntityManager entityManager = JPAEntityFactory.getEntityManager();int currentPage = 2; // 页码int lineSize = 2;// 每页行数String keyWord = "%Spring%";// Course不是表名称 而是对应的实体类名String jpql = "select c from Course as c where c.cname like ?1";// JPQL 查询语句TypedQuery<Course> query = entityManager.createQuery(jpql, Course.class);query.setFirstResult((currentPage - 1) * lineSize); // 开始查询行query.setMaxResults(lineSize); //每页行数// 设置? 参数query.setParameter(1, keyWord); List<Course> list = query.getResultList();for (Course course : list) {loggerFactory.info("【查询结果:】 {}", course);}// 关闭连接JPAEntityFactory.close();}
执行结果:
执行的sql: select c1_0.cid, c1_0.cname, c1_0.credit, c1_0.end, c1_0.num, c1_0.start from course c1_0 where c1_0.cname like ? limit ?,?
5、4 count
@Testpublic void testSelectCount() {EntityManager entityManager = JPAEntityFactory.getEntityManager();String keyWord = "%Spring%";// Course不是表名称 而是对应的实体类名String jpql = "select count(c) from Course as c where c.cname like ?1";// JPQL 查询语句Query query = entityManager.createQuery(jpql);// 设置? 参数query.setParameter(1, keyWord);loggerFactory.info("【符合模糊查询的数据量:】 {}", query.getSingleResult());// 关闭连接JPAEntityFactory.close();}
执行结果:
执行的sql: select count(c1_0.cid) from course c1_0 where c1_0.cname like ?
【符合模糊查询的数据量:】 4
5、5 更新
例如:我们想把学分小于5的课程全部提高到5
示例代码:
public static Logger loggerFactory = LoggerFactory.getLogger(TestCourseUpdate.class);@Testpublic void testUpdate() {JPAEntityFactory.getEntityManager().getTransaction().begin(); // 开启事务// Course不是表名称 而是对应的实体类名String jpql = "update Course as c set c.credit = ?1 where c.credit 2";// JPQL 查询语句Query query = JPAEntityFactory.getEntityManager().createQuery(jpql); // 预处理sqlquery.setParameter(1, 5); // 第一个?query.setParameter(2, 5); // 第二个?loggerFactory.info("【更新结果:】{}", query.executeUpdate()); // 执行sqlJPAEntityFactory.getEntityManager().getTransaction().commit();// 提交事务// 关闭连接JPAEntityFactory.close();}
执行结果:
**执行的sql:**update course set credit= ? where credit< ?
5、6 删除指定id
示例代码:
@Testpublic void testDelete() {JPAEntityFactory.getEntityManager().getTransaction().begin(); // 开启事务// Course不是表名称 而是对应的实体类名String jpql = "delete from Course as c where c.cid 1";// JPQL 查询语句Query query = JPAEntityFactory.getEntityManager().createQuery(jpql);query.setParameter(1, 1); // id为1loggerFactory.info("【更新结果:】{}", query.executeUpdate());JPAEntityFactory.getEntityManager().getTransaction().commit();// 提交事务// 关闭连接JPAEntityFactory.close();}
执行结果:
**执行的sql:**delete from course where cid< ?
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

