原生SQL

JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持。下面小节一起来看看吧。

查询单个

示例代码:

@Test
    public 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); // 预处理sql
        query.setParameter(1, 1);
        Course course = (Course) query.getSingleResult();
        loggerFactory.info("【执行结果】:{}",course ); // 执行sql
        JPAEntityFactory.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]

可以发现,query.getSingleResult() 返回的是一个数组对象。不能转换成Course也是正常的。后续文章会解决这个问题

查询多个

实例代码:

@Test
public void getAllCourse() {
    EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接
    String sql = "select cid, cname, credit, end, num, start "  
            "from yootk.course ";
    Query query = entityManager.createNativeQuery(sql); // 预处理sql
    List list = query.getResultList();// 执行sql
    for (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]

分页模糊查询

示例代码:

@Test
    public 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); // 预处理sql
        query.setFirstResult((current - 1) * lineSize); // 等同于 limit ?
        query.setMaxResults(lineSize); //  // 等同于 limit ?,?
        query.setParameter("k1", keyWord);
        List list = query.getResultList();// 执行sql
        for (Object o : list) {
            loggerFactory.info("【执行结果】:{}", o);
        }
        JPAEntityFactory.close();// 关闭连接

执行结果:

执行的sql: select cid,cname,credit,end,num,start from yootk.course where cname like ? limit ?,?

count

统计 模糊匹配到的行数

//  统计行数
    @Test
    public 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); // 预处理sql
        query.setParameter("k1", keyWord);
        loggerFactory.info("【执行结果】:{}", query.getSingleResult());// 执行sql
        JPAEntityFactory.close();// 关闭连接
    }

执行结果

执行的sql: select count(*) from yootk.course where cname like ?

更新

例如:我们想把学分小于5的课程全部提高到5

注意到:我们当前是未开启事务的,观察程序执行结果。

@Test
    public void getUpdateCourse() {
        // 例如:我们想把学分小于5的课程全部提高到5
        EntityManager 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); // 预处理sql
        query.setParameter(1, 5);
        query.setParameter(2, 5);
        loggerFactory.info("【执行结果】:{}", query.executeUpdate());// 执行sql
        //entityManager.getTransaction().commit(); // 提交事务
        JPAEntityFactory.close();// 关闭连接
    }

执行结果:

异常提示信息为:说我们的 update / delete 操作需要事务的支持

把上叙代码注释掉的事务,放开执行即可。

删除指定id

示例代码:

// 删除指定id
    @Test
    public 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());// 执行sql
        entityManager.getTransaction().commit(); // 提交事务
        JPAEntityFactory.close();// 关闭连接
    }

执行结果

执行的sql: delete from yootk.course where cid = ?

新增

实例代码:

@Test
    public void addCourse() {
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于获取连接
        entityManager.getTransaction().begin(); //开启事务
        String addSql = "insert into yootk.course(cname, credit, end, num, start) "  
                "value(:cname,:credit,:end,:num,:start )";
        Query query = entityManager.createNativeQuery(addSql);
        query.setParameter("cname", "java就业课程实战"); // 对预处理参数赋值
        query.setParameter("credit", 10); // 对预处理参数赋值
        query.setParameter("start", DateUtil.stringToDate("2021-10-01")); // 对预处理参数赋值
        query.setParameter("end", DateUtil.stringToDate("2022-10-01")); // 对预处理参数赋值
        query.setParameter("num", 999); // 对预处理参数赋值
        query.executeUpdate(); // 执行最终sql
        entityManager.getTransaction().commit();// 提交事务
    }

执行结果:

到此这篇关于JPA原生SQL实现增删改查的示例详解的文章就介绍到这了,更多相关JPA SQL增删改查内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

JPA原生SQL实现增删改查的示例详解的更多相关文章

  1. iOS开发中使用SQL语句操作数据库的基本用法指南

    这篇文章主要介绍了iOS开发中使用SQL语句操作数据库的基本用法指南,包括一些常用SQL语句的整理,需要的朋友可以参考下

  2. Spring Data JPA系列JpaSpecificationExecutor用法详解

    这篇文章主要为大家介绍了Spring Data JPA系列JpaSpecificationExecutor用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. 使用PHP反射机制来构造"CREATE TABLE"的sql语句

    今天小编就为大家分享一篇关于使用PHP反射机制来构造"CREATE TABLE"的sql语句,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  4. nodejs操作mysql实现增删改查的实例

    下面小编就为大家带来一篇nodejs操作mysql实现增删改查的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. Android连接MySQL数据库并进行增删改查操作示例讲解

    这篇文章主要介绍了Android 连接MySQL数据库并进行增删改查操作示例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】

    这篇文章主要介绍了PHP7使用ODBC连接SQL Server2008 R2数据库,结合实例形式分析了基于thinkPHP5.1框架使用ODBC连接SQL Server2008数据库相关操作技巧,需要的朋友可以参考下

  7. Python创建SQL数据库流程逐步讲解

    会写SQL很重要,能高效地查询数据库被认为是数据分析师/科学家最基本的技能之一。SQL不仅重要,而且非常常用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  8. Spring Boot 整合持久层之Spring Data JPA

    在介绍Spring Data JPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射技术实现数据访问,O/R映射即将领域模型类和数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无须关注数据库相关的技术

  9. 使用JPA插入枚举类型字段

    这篇文章主要介绍了使用JPA插入枚举类型字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. PHP实现单条sql执行多个数据的insert语句方法

    今天小编就为大家分享一篇PHP实现单条sql执行多个数据的insert语句方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部