返回顶部
首页 > 资讯 > 精选 >spring-data-jpa怎么使用自定义repository来实现原生sql
  • 728
分享到

spring-data-jpa怎么使用自定义repository来实现原生sql

2023-06-21 20:06:47 728人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关spring-data-jpa怎么使用自定义repository来实现原生sql的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用自定义repository实现原生sqlSpring D

这篇文章给大家分享的是有关spring-data-jpa怎么使用自定义repository来实现原生sql的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

使用自定义repository实现原生sql

Spring Data JPA中的Repository是接口,是JPA根据方法名帮我们自动生成的。但很多时候,我们需要为Repository提供一些自定义的实现。今天我们看看如何为Repository添加自定义的方法。

自定义Repository接口

首先我们来添加一个自定义的接口:

  • 添加BaseRepository接口

  • BaseRepository继承了JpaRepository,这样可以保证所有Repository都有jpa提供的基本方法。

  • 在BaseRepository上添加@NoRepositoryBean标注,这样Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口

@NoRepositoryBeanpublic interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID> {     //sql原生查询    List<Map<String, Object>> listBySQL(String sql);}

接下来实现BaseRepository接口,并继承SimpleJpaRepository类,使其拥有Jpa Repository的提供的方法实现。

public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T,ID> implements BaseRepository<T,ID> {    private final EntityManager entityManager;    //父类没有不带参数的构造方法,这里手动构造父类    public BaseRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {        super(domainClass, entityManager);        this.entityManager = entityManager;    }     //通过EntityManager来完成查询    @Override    public  List<Map<String, Object>> listBySQL(String sql) {        return entityManager.createNativeQuery(sql).getResultList();    }}

这里着重说下EntityManager

EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储。也可以根据他进行sql的原生查找。

源码如下:

public interface EntityManager {    <T> T find(Class<T> var1, Object var2);    Query createNativeQuery(String var1);    Query createNativeQuery(String var1, Class var2);    Query createNativeQuery(String var1, String var2);}

由上可以看出其有具体的原生查询实现接口 createNativeQuery

接下来需要将我们自定义的Repository接口,通过工厂模式添加到Spring的容器中:

创建自定义RepositoryFactoryBean

接下来我们来创建一个自定义的RepositoryFactoryBean来代替默认的RepositoryFactoryBean。RepositoryFactoryBean负责返回一个RepositoryFactory,Spring Data Jpa 将使用RepositoryFactory来创建Repository具体实现。

查看JpaRepositoryFactoryBean的源码,通过createRepositoryFactory返回JpaRepositoryFactory实例:

public class JpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends TransactionalRepositoryFactoryBeanSupport<T, S, ID> { private EntityManager entityManager; public JpaRepositoryFactoryBean(Class<? extends T> repositoryInterface) {  super(repositoryInterface); }  @PersistenceContext public void setEntityManager(EntityManager entityManager) {  this.entityManager = entityManager; }  @Override public void setMappinGContext(MappingContext<?, ?> mappingContext) {  super.setMappingContext(mappingContext); }  @Override protected RepositoryFactorySupport doCreateRepositoryFactory() {  return createRepositoryFactory(entityManager); }  protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {  return new JpaRepositoryFactory(entityManager); }  @Override public void afterPropertiesSet() {   Assert.notNull(entityManager, "EntityManager must not be null!");  super.afterPropertiesSet(); }}

终上我们可根据相应的规则进行创建自定义RepositoryFactoryBean

public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> {    public BaseRepositoryFactoryBean(Class<? extends R> repositoryInterface) {        super(repositoryInterface);    }     @Override    protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) {        return new BaseRepositoryFactory(em);    }     //创建一个内部类,该类不用在外部访问    private static class BaseRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {        private final EntityManager em;        public BaseRepositoryFactory(EntityManager em) {            super(em);            this.em = em;        }         //设置具体的实现类是BaseRepositoryImpl        @Override        protected Object getTargetRepository(RepositoryInfORMation information) {            return new BaseRepositoryImpl<T, I>((Class<T>) information.getDomainType(), em);        }         //设置具体的实现类的class        @Override        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {            return BaseRepositoryImpl.class;        }    }}

自定义完成。

SpringDataJpa原生SQL查询

一些比较复杂的关联查询要怎么实现呢,JPA的处理方法是:利用原生的SQL命令来实现那些复杂的关联查询,通过设置nativeQuery = true 来设置开启使用数据库原生SQL语句。下面就在上一个案例的基础上实现原生sql的增删改查,代码如下。

a.首先在StudentRepository里添加如下方法

//利用原生的SQL进行查询操作 @Query(value = "select s.* from studenttb s where s.student_name=?1", nativeQuery = true) public List<Student> findStudentByName(String name);//利用原生的SQL进行删除操作 @Query(value = "delete from studenttb where student_id=?1 ", nativeQuery = true) @Modifying@Transactional public int deleteStudentById(int uid); //利用原生的SQL进行修改操作 @Query(value = "update studenttb set student_name=?1 where student_id=?2 ", nativeQuery = true)@Modifying @Transactional public int updateStudentName(String name,int id);//利用原生的SQL进行插入操作@Query(value = "insert into studenttb(student_name,student_age) value(?1,?2)", nativeQuery = true)@Modifying@Transactional public int insertStudent(String name,int age); @Query(value=" SELECT * FROM studenttb WHERE STUDENT_NAME LIKE %:name% ",nativeQuery=true) List<Student> queryBynameSQL(@Param(value = "name") String name);

b.在StudentController里面进行调用以上方法

代码如下:

//原生sql的调用  @RequestMapping("/findStudentByName") public Object findStuByName(String name) {     List<Student> student = repository.findStudentByName(name);     return student; } @RequestMapping("/deleteStudentById") public Object deleteStudentById(int id) {     int i = repository.deleteStudentById(id);     Map<String,Object> map=new HashMap<String,Object>();     if(i>0) {         map.put("success", true);     } else {         map.put("success", false);     }    return map; } @RequestMapping("/updateStudentName") public Object updateStudentName(String name,int id) {     int i = repository.updateStudentName(name,id);     Map<String,Object> map=new HashMap<String,Object>();     if(i>0) {         map.put("success", true);     } else {         map.put("success", false);     }    return map; } @RequestMapping("/insertStudent") public Object insertStudent(String name,int age) {     int i = repository.insertStudent(name,age);     Map<String,Object> map=new HashMap<String,Object>();     if(i>0) {         map.put("success", true);     } else {         map.put("success", false);     }    return map; } @RequestMapping("/queryBynameSQL") public Object queryBynameSQL(String name) {     List<Student> student= repository.queryBynameSQL(name);     return student; }

运行效果请各位自行测试

感谢各位的阅读!关于“spring-data-jpa怎么使用自定义repository来实现原生sql”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: spring-data-jpa怎么使用自定义repository来实现原生sql

本文链接: https://lsjlt.com/news/300526.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • spring-data-jpa使用自定义repository来实现原生sql
    目录使用自定义repository实现原生sql自定义Repository接口创建自定义RepositoryFactoryBeanSpringDataJpa原生SQL查询a.首先在S...
    99+
    2024-04-02
  • spring-data-jpa怎么使用自定义repository来实现原生sql
    这篇文章给大家分享的是有关spring-data-jpa怎么使用自定义repository来实现原生sql的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用自定义repository实现原生sqlSpring D...
    99+
    2023-06-21
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2024-04-02
  • Spring Data JPA怎么自定义Repository接口
    本篇内容主要讲解“Spring Data JPA怎么自定义Repository接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Data J...
    99+
    2023-06-30
  • Spring Data JPA框架的Repository怎么自定义
    本文小编为大家详细介绍“Spring Data JPA框架的Repository怎么自定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Data JPA框架的Repository怎么自...
    99+
    2023-06-30
  • Spring Data JPA框架的Repository自定义实现详解
    目录1. Spring Data Repository自定义实现1.1 自定义特殊repository1.2 配置类1.3 解决歧义1.4 手动装配1.5 自定义Base Repos...
    99+
    2024-04-02
  • 怎么使用spring data jpa自定义sql方式
    本篇内容介绍了“怎么使用spring data jpa自定义sql方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!sp...
    99+
    2023-06-22
  • spring boot之使用spring data jpa的自定义sql方式
    目录spring data jpa介绍自定义SQL查询jpa两种自定义SQL的方式1. 原生SQL2. 实体类SQLspring data jpa介绍 PA(Java Persist...
    99+
    2024-04-02
  • Spring Data Jpa如何实现自定义方法
    这篇文章将为大家详细讲解有关Spring Data Jpa如何实现自定义方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring Data Jpa 自定义方法的实现最近项目中用到...
    99+
    2023-06-22
  • Spring Data JPA映射怎么自定义实体类
    这篇文章主要介绍“Spring Data JPA映射怎么自定义实体类”,在日常操作中,相信很多人在Spring Data JPA映射怎么自定义实体类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-25
  • 使用Spring Data JPA如何实现自定义规则查询
    使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or    &nbs...
    99+
    2023-05-31
    spring data jpa
  • 关于Spring Data Jpa 自定义方法实现问题
    目录Spring Data Jpa 自定义方法的实现自己的接口主接口我新建一个类来实现我自己的接口Spring Data Jpa自定义方法关键字Spring Data Jpa 自定义...
    99+
    2024-04-02
  • Spring Data JPA使用JPQL与原生SQL进行查询的操作
    1、使用JPQL语句进行查询 JPQL语言(Java Persistence Query Language)是一种和SQL非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底...
    99+
    2024-04-02
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑
    目录Springdatajpa@Query使用原生Sql的坑根据代码来解说:需要注意的方法有以下几点SpringDataJPA@Query动态SQL语句思路实现Spring data...
    99+
    2024-04-02
  • 怎么使用JPA自定义SQL查询结果
    本篇内容介绍了“怎么使用JPA自定义SQL查询结果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JPA自定义SQL查询结果很多时候都会遇到自...
    99+
    2023-06-25
  • Spring Data JPA实现查询结果返回map或自定义的实体类
    目录Spring Data JPA查询结果返回map或自定义的实体类1.工具类2.具体应用spingboot:jpa:Spring data jpa 返回map 结果集Spring ...
    99+
    2024-04-02
  • asp.net怎么使用原生控件实现自定义列导出功能
    本篇内容主要讲解“asp.net怎么使用原生控件实现自定义列导出功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“asp.net怎么使用原生控件实现自定义列导出功能”吧!自定义列实现最近负责开发...
    99+
    2023-06-28
  • JPA怎么使用findBy方法自定义查询
    这篇文章给大家分享的是有关JPA怎么使用findBy方法自定义查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JPA使用findBy方法自定义查询最近在项目中使用spring boot+jpa的方式来访问数据库...
    99+
    2023-06-21
  • 怎么使用mybatisplus自带QueryWrapper自定义sql实现复杂查询
    这篇文章主要介绍“怎么使用mybatisplus自带QueryWrapper自定义sql实现复杂查询”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用mybatisplus自带QueryWrap...
    99+
    2023-07-04
  • 使用Spring AOP 如何实现自定义注解
    这期内容当中小编将会给大家带来有关使用Spring AOP 如何实现自定义注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Maven中加入以下以依赖:<!-- Spring AOP + Aspe...
    99+
    2023-05-31
    springaop 注解
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作