JPA原生SQL实现增删改查的示例详解

 更新时间:2022年09月29日 11:20:06   作者:look-word  
JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持。本文将利用生SQL实现增删改查功能,文中的示例代码讲解详细,需要的可以参考一下

原生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增删改查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现yml配置文件为变量赋值

    SpringBoot实现yml配置文件为变量赋值

    这篇文章主要介绍了SpringBoot实现yml配置文件为变量赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 老生常谈 java匿名内部类

    老生常谈 java匿名内部类

    下面小编就为大家带来一篇老生常谈java匿名内部类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • SpringBoot整合Mybatis Plus实现基本CRUD的示例代码

    SpringBoot整合Mybatis Plus实现基本CRUD的示例代码

    Mybatis Plus是在Mybatis的基础上的增强,使得我们对一些基本的CRUD使用起来更方便,本文主要介绍了SpringBoot整合Mybatis Plus实现基本CRUD的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • Java实现向数组里添加元素

    Java实现向数组里添加元素

    这篇文章主要介绍了Java实现向数组里添加元素方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能

    springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能

    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题,下面这篇文章主要给大家介绍了关于springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能的相关资料,需要的朋友可以参考下
    2023-06-06
  • java 取交集方法retainAll的实现

    java 取交集方法retainAll的实现

    这篇文章主要介绍了java 取交集方法retainAll的实现操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • RabbitMQ死信机制实现延迟队列的实战

    RabbitMQ死信机制实现延迟队列的实战

    本文主要介绍了RabbitMQ死信机制实现延迟队列的实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java限流实现的几种方法详解

    Java限流实现的几种方法详解

    这篇文章主要介绍了Java限流实现的几种方法,通俗的说,限流就是 限制一段时间内,用户访问资源的次数,减轻服务器压力,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • MyBatis XPathParser解析器使用范例详解

    MyBatis XPathParser解析器使用范例详解

    这篇文章主要介绍了关于MyBatis中解析器XPathParser的实际使用实践,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2022-07-07
  • Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法

    Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法

    这篇文章主要给大家介绍了关于Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们来一起看看吧
    2018-05-05

最新评论