扩展spring data jpa的repository
在我们编写代码的过程中,spring data jpa为我们的持久层提供的极大的方便,但有时spring data jpa提供的repository并不能完全满足我们开发的需求,因此就需要进行扩展。spring data jpa的repository的扩展可以对对单个repository的扩展,也可以对全局的扩展,本博客考虑的是对全局的扩展。 对单个repository的扩展可以考虑看这篇文章。
思路:(大致参考spring data jpa的官方文档,链接如下:http://docs.spring.io/spring-data/jpa/docs/1.11.1.RELEASE/reference/html/#repositories.custom-behaviour-for-all-repositories)
1、自己写一个接口继承spring data jpa 提供的Repository接口
2、编写一个自己的接口的实现类并继承SimpleJpaRepository接口
3、使用@EnableJpaRepositories注解的repositoryBaseClass属性指定我们上一步的实现类
注意事项:
1、自定义的接口上需要加上@NoRepositoryBean注解,这个注解表示我们自定义的这个接口不让spring 帮我们自动创建代理类。(为什么需要加这个注解,可以看这个。)
2、我自定义的接口中返回的是Map,这个依赖jpa的底层是hibernate的实现,如果是别的实现代码需要修改。
3、代码采用的技术是spring boot + spring data jpa
代码:
1、引入pom依赖(引入spring io,这个可以帮我们管理好jar的版本,防止jar包冲突)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Brussels-SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
2、编写自定义的Repository接口(接口上需要加上@NoRepositoryBean这个注解)
/**
* <pre>
* sql repository用于执行sql语句
* @NoRepositoryBean 表示spring data jpa不为这个注解标注的接口创建实现了类
* </pre>
*
* @描述
* @作者 huan
* @时间 2017年5月21日 - 下午7:26:01
*/
@NoRepositoryBean
public interface SqlRepository<T, ID extends Serializable> extends JpaRepository<T, Serializable> {
Map<String, Object> executeDynamicSelectOneSql(String sql);
}
3、编写接口的实现(返回Map使用了hibernate的一个特性)
/**
* sql repository的基础实现
*
* @描述
* @作者 huan
* @时间 2017年5月21日 - 下午7:27:24
*/
public class SqlRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, Serializable> implements SqlRepository<T, Serializable> {
private EntityManager entityManager;
public SqlRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
@Override
@SuppressWarnings("unchecked")
public Map<String, Object> executeDynamicSelectOneSql(String sql) {
Query query = entityManager.createNativeQuery(sql);
return (Map<String, Object>) query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).uniqueResult();
}
}
4、在spring boot的启动类上加上@EnableJpaRepositories注解,启用我们自己写的Repository
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = SqlRepositoryImpl.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
5、application.yml中jpa的配置
server:
port: 80
context-path: /bs
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/huan?useUnicode=true&characterEncoding=utf-8
username: root
password: root
jpa:
generate-ddl: true #
show-sql: true
properties:
hibernate.format_sql : true
6、测试 (这个SqlRepository中的泛型Book是我的一个实体类,在这个例子中没有影响)
扩展spring data jpa的repository的更多相关文章
- IntelliJ IDEA 2017版 spring-boot使用Spring Data JPA使用Repository<T, T>编程
1.环境搭建pom.xml搭建 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...
- 【spring data jpa】repository中使用@Query注解使用hql查询,使用@Param引用参数,报错:For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on
在spring boot中, repository中使用@Query注解使用hql查询,使用@Param引用参数 如题报错: For queries with named parameters you ...
- 【redis】5.spring boot项目中,直接在spring data jpa的Repository层使用redis +redis注解@Cacheable直接在Repository层使用,报错问题处理Null key returned for cache operation
spring boot整合redis:http://www.cnblogs.com/sxdcgaq8080/p/8028970.html 首先,明确一下问题的场景 之前在spring boot整合re ...
- 扩展spring data jpa的数据更新方法时注意事项
//此处必须加@Transactional,否则不能运行,报错 @Transactional @Modifying @Query("update ExamItem a set a.versi ...
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- spring data jpa hibernate jpa 三者之间的关系
JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...
- 转:spring data jpa、 hibernate、 jpa 三者之间的关系
原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...
- 学习Spring Data JPA
简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特殊 ...
- spring data jpa、 hibernate、 jpa 三者之间的关系
http://www.cnblogs.com/xiaoheike/p/5150553.html JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架-- ...
随机推荐
- 只需3步,快来用AI预测你爱的球队下一场能赢吗?
摘要:作为球迷,我们有时候希望自己拥有预测未来的能力. 本文分享自华为云社区<用 AI 预测球赛结果只需三步,看看你爱的球队下一场能赢吗?>,作者:HWCloudAI. 还记得今年夏天的欧 ...
- freeswitch python模块
概述 freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等.freeswitch在使用python做业务开发时,有俩种接入方式,一种是ES ...
- Django学习day15BBS项目开发2.0
每日测验 """ 今日日考 1.img标签src属性可以指代的值有哪些,各有什么特点 2.pillow模块是干什么用的,主要的方法有哪些 3.简述登陆功能图片验证码相关逻 ...
- COS控制台进阶 - 文件预览和在线编辑
导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...
- 简单入门PHP中的多字节字符串操作
什么是多字节的字符串操作呢?其实不少的同学可能都已经使用过了,但我们还是要从最基础的问题说起. 一个字符占几个字节并不是我们表面上看到的那样.正常情况下,一个数字或英文以及英文符号都是占用一个字节的. ...
- PHP的rar解压读取扩展包学习
作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者.rar 格式的压缩包是 Windows 系统中有接近统治地位的存在,今天我们学习的 PHP 扩展就是针对 ...
- Shell系列(12)- 预定义变量(5)
预定义变量 作用 $? 常用:最后一次执行的命令的返回状态. 如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了 $$ ...
- postgres 基础SQL语句 增删改
查看已创建的数据库:select datname from pg_database; 查看所有数据库的详细信息:select * from pg_database 创建数据库:create datab ...
- php 页面公共部分 转化为js document.write(); 并由匿名函数包裹
页面公共部分以javascript document.write()方式加载 生成的js放到需要的位置 footer.js 放到body底部引入 ... <script src=" ...
- Kafka与RocketMq文件存储机制对比
一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一. 开头问题 kafka文件结构和rocketMQ文件结构是什么样子?特点是什么? 一.目录结构 Kafk ...