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类
文章插图
执行结果:
【执行结果】:[1, Spring编程实战, 5, 2022-12-30, 88, 2022-09-19]6、2 查询多个实例代码:
可以发现,query.getSingleResult() 返回的是一个数组对象 。不能转换成Course也是正常的 。后续文章会解决这个问题
@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]6、3 分页模糊查询示例代码:
【执行结果】:[5, SpringCloud编程实战, 5, 2022-12-30, 88, 2022-09-19]
【执行结果】:[6, SSM编程实战, 5, 2022-12-30, 88, 2022-09-19]
@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();// 关闭连接}
执行结果:异常提示信息为:说我们的 update / delete 操作需要事务的支持
- 把上叙代码注释掉的事务,放开执行即可 。
文章插图
6、6 删除指定id示例代码:
// 删除指定id@Testpublic void deleteById() {EntityManager entityManager = JPAEntityFactory.getEntityManager(); // 等同于 获取连接entityManager.getTransaction().begin(); // 开启事务String deleteSql = "delete from yootk.course where cid = ?1";Query query = entityManager.createNativeQuery(deleteSql);query.setParameter(1, 1); // 预处理sql 赋值loggerFactory.info("【执行结果】:{}", query.executeUpdate());// 执行sqlentityManager.getTransaction().commit(); // 提交事务JPAEntityFactory.close();// 关闭连接}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1、显示发布者的名字;2、增加新UI、3、关注其他学员的 canister IC入门课第五课作业:完善 Microblog 前端
- 五菱宏光mini敞篷报价及图片 五菱宏光mini敞篷
- 耐克最佳篮球鞋排行榜,乔丹11排第五,第一真难让人猜到
- 原神要地防御第五天怎么做
- 手相女人图解右手感情线,其详情是这样的,大致可以分为五种
- 五种男人富贵的手相图片分析,对照看看你能不能抓住财富
- 五指山水满春连养殖农民专业合作社_工商信用信息_经营范围期限状态_法人_地址_注册资本_怎么样
- 小学五年级数学考试反思应该怎么写 小学五年级数学反思怎么写
- 我是哈尔滨兴隆镇的 我们这现在的猪价是五块八 朋友们你们说猪价还能涨吗?
- 拼多多评价怎么修改成五星 拼多多评价怎么修改