五 JPA - 原生SQL实现增删改查

6、原生SQL

JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持 。下面小节一起来看看吧 。
6、1 查询单个示例代码:
@Testpublic void getSingle() {EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接String sql = "select cid, cname, credit, end, num, start " +"from yootk.course where cid = ?1";Query query = entityManager.createNativeQuery(sql); // 预处理sqlquery.setParameter(1, 1);Course course = (Course) query.getSingleResult();loggerFactory.info("【执行结果】:{}",course ); // 执行sqlJPAEntityFactory.close();// 关闭连接}执行结果:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class look.word.po.Course
意思是 query.getSingleResult() 不能转换成 Course类
修改代码
五 JPA - 原生SQL实现增删改查

文章插图
执行结果:
【执行结果】:[1, Spring编程实战, 5, 2022-12-30, 88, 2022-09-19]
可以发现,query.getSingleResult() 返回的是一个数组对象 。不能转换成Course也是正常的 。后续文章会解决这个问题
6、2 查询多个实例代码:
@Testpublic void getAllCourse() {EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接String sql = "select cid, cname, credit, end, num, start " +"from yootk.course ";Query query = entityManager.createNativeQuery(sql); // 预处理sqlList list = query.getResultList();// 执行sqlfor (Object o : list) {loggerFactory.info("【执行结果】:{}", o);}JPAEntityFactory.close();// 关闭连接}执行结果:
【执行结果】:[1, Spring编程实战, 5, 2022-12-30, 88, 2022-09-19]
【执行结果】:[5, SpringCloud编程实战, 5, 2022-12-30, 88, 2022-09-19]
【执行结果】:[6, SSM编程实战, 5, 2022-12-30, 88, 2022-09-19]
6、3 分页模糊查询示例代码:
@Testpublic void getAllCourseSplit() {int current = 2;int lineSize = 3;String keyWord = "%Spring%";EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接String sql = "select cid, cname, credit, end, num, start " +"from yootk.course where cname like :k1";Query query = entityManager.createNativeQuery(sql); // 预处理sqlquery.setFirstResult((current - 1) * lineSize); // 等同于 limit ?query.setMaxResults(lineSize); //// 等同于 limit ?,?query.setParameter("k1", keyWord);List list = query.getResultList();// 执行sqlfor (Object o : list) {loggerFactory.info("【执行结果】:{}", o);}JPAEntityFactory.close();// 关闭连接执行结果:
执行的sql: select cid,cname,credit,end,num,start from yootk.course where cname like ? limit ?,?
6、4 count
统计 模糊匹配到的行数
//统计行数@Testpublic void getAllCourseCount() {String keyWord = "%Spring%";EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接String sql = "select count(*) from yootk.course where cname like :k1";Query query = entityManager.createNativeQuery(sql); // 预处理sqlquery.setParameter("k1", keyWord);loggerFactory.info("【执行结果】:{}", query.getSingleResult());// 执行sqlJPAEntityFactory.close();// 关闭连接}执行结果
执行的sql: select count(*) from yootk.course where cname like ?
6、5 更新
例如:我们想把学分小于5的课程全部提高到5
  • 注意到:我们当前是未开启事务的,观察程序执行结果 。
@Testpublic void getUpdateCourse() {// 例如:我们想把学分小于5的课程全部提高到5EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接//entityManager.getTransaction().begin(); // 开启事务String sql = "update yootk.course as c set c.credit = ?1 where c.credit <?2";Query query = entityManager.createNativeQuery(sql); // 预处理sqlquery.setParameter(1, 5);query.setParameter(2, 5);loggerFactory.info("【执行结果】:{}", query.executeUpdate());// 执行sql//entityManager.getTransaction().commit(); // 提交事务JPAEntityFactory.close();// 关闭连接}

经验总结扩展阅读