之前没有使用过spring-data,关于spring-data有很多很棒的设计,例如仅仅只需要声明一个接口就行,你甚至都不需要去实现,spring-data有内置默认的实现类,基本就上完成绝大多数对单表的操作

然后是因为使用es,也想着用spring-data来集成,遇到自定义的repository的问题,网上找到大多数文字讲的都不是很清晰,在一番折腾了之后,把自己的做法分享一下

下面是我接口和类的UML图

其中 ICustomerRepository 是我打算实现自定义的repository的接口,这里根据spring-data的约定,后缀都是Repository

ICustomerRepositoryCustom是我要实现的自定义的方法,例如我想在查询后根据业务什么的做一些转换和过滤,在这个例子中,就统一在doSomeThind中了

最终的重点来了,对于自定义的方法,spring-data是需要我们来告诉它,是由于哪个类来实现,而ICustomerRepository同时也继承了ICustomerRepositoryCustom接口,如果这个时候,实现类的命令是以 ICustomerRepositoryCustomImpl来命名的,并去实现ICustomerRepositoryCustom,那么在方法调用中,会报告一个property exception的错误,说找不到doSomeThing这个属性,因为这个问题搞了很久,后面去结合别人的文章,总算是晓得了

你需要实现的接口是ICustomerRepositoryCustom没有错,但命名上需要是ICustomerRepositoryImpl,否则spring-data会找不到它的实现类,就默认这个方法是你传入的Bean的属性,以下是具体的代码,仅供参考

@Repository
public interface ICustomerRepository extends ElasticsearchRepository<User, String>
, ICustomerRepositoryCustom<User, String> { List<User> findByLastName(String lastName); List<User> findByFirstName(String firstName); List<User> findUsersByAgeBetweenOrderByBirthdayDesc(Integer min, Integer max); } public interface ICustomerRepositoryCustom<T, ID extends Serializable> { void doSomeThing(); } @Component
public class ICustomerRepositoryImpl implements ICustomerRepositoryCustom<User,String> { @Override
public void doSomeThing() {
System.out.println("我是自定义的一个实现方法");
}
} // 这个bean根据你是要集成什么数据库会有不同,这里我集成的是es,因此声明索引是什么,以及各个字段
@Document(indexName = "user")
public class User { @Id
private String id; @Field
private String firstName; @Field
private String lastName; @Field
private Integer age; @Field
private Date birthday = new Date(); public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}

经过上面的折腾后,你就可以很潇洒的在业务层这样调用了

    @Autowired
private ICustomerRepository customerRepository; @RequestMapping(value = "/user/{name}", method = RequestMethod.PUT)
public User put(@PathVariable String name) {
User u = new User();
u.setFirstName(name);
u.setLastName("tom");
u.setAge(random.nextInt(99));
// 这个是spring-data默认给我们实现的
customerRepository.save(u);
// 这个是我们自定义的方法
customerRepository.doSomeThing();
return u;
}

关于spring-data与elasticsearch的使用,自定义repository的更多相关文章

  1. Spring Data 整合 ElasticSearch搜索服务器

    一.基于 maven 导入坐标(pom.xml文件) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  2. Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...

  3. Spring Data与elasticsearch版本对应关系

  4. Spring Data Jpa 使用@Query标注自定义查询语句

    https://blog.csdn.net/daniel7443/article/details/51159865 https://blog.csdn.net/pp_fzp/article/detai ...

  5. Spring Data Elasticsearch 用户指南

    https://www.jianshu.com/p/27e1d583aafb 翻译自官方文档英文版,有删减. BioMed Central Development Team version 2.1.3 ...

  6. 3.4_springboot2.x整合spring Data Elasticsearch

    Spring Data Elasticsearch 是spring data对elasticsearch进行的封装. 这里有两种方式操作elasticsearch: 1.使用Elasticsearch ...

  7. Spring Data ElasticSearch的使用

    1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...

  8. 将自定义功能添加到Spring Data Repository

    Spring Data非常方便,可以加快开发速度,避免使用样板代码. 但是,在某些情况下,注释查询不足,而无法达到您可能希望实现的自定义功能. 因此,Spring Data允许我们向Spring Da ...

  9. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  10. Spring Data JPA(官方文档翻译)

    关于本书 介绍 关于这本指南 第一章 前言 第二章 新增及注意点 第三章 项目依赖 第四章 使用Spring Data Repositories 4.1 核心概念 4.2 查询方法 4.3 定义rep ...

随机推荐

  1. 惊天秘密!如何在 Flutter 项目中实现操作引导

    不要冒然评价我,你只知道我的名字,却不知道我的故事,你只是听闻我做了什么,却不知我经历过什么. 俗话说得好,产品有三宝,弹窗浮层加引导. 上图截图自我司 App 晓黑板中的口算模块,相信每个 App ...

  2. .net5+nacos+ocelot 配置中心和服务发现实现

    最近一段时间 因公司业务需要,需要使用.net5做一套微服务的接口,使用nacos 做注册中心和配置中心,ocelot做网关. 因为ocelot 支持的是consol和eureka,如果使用nacos ...

  3. ThreadX——IPC应用之信号量

    一.应用简介 在RTOS的应用开发中,信号量也是经常使用到的一种用于多任务之间信息同步.资源互斥访问的一种手段,常用于协调多个任务访问同一资源的场景.信号量又分为计数信号量和互斥信号量.计数信号量可以 ...

  4. Python的基本介绍

    我认为Python打破了传统语言的各种细节,让我对编程语音有了全新认识 Python的优势: 可移植性高,解释性更加简单,这两点在编程语言发展到现在已经成为不可或缺的一部分,而很多种编程语言能做到这几 ...

  5. 【Tomcat 源码系列】Tomcat 整体结构

    一,前言 在开始看源码细节之前,首先要想好要看的问题.想好问题之后,我们该如何寻找要看的代码呢? 其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置.带着问题 ...

  6. ES6新增数据类型Symbol

    Symbol的含义? ES6(2015) 引入了第七种原始数据类型Symbol,Symbol英文文意思为 符号.象征.标记.记号,在 js 中更确切的翻译应该为独一无二的 Symbol的使用? Sym ...

  7. js上 九.多分支语句

    9-3.if...else if ...else语句 多分支的if语句,多选一. 格式:

  8. 网络知识扫盲——DNS

    参考文章链接  : https://baijiahao.baidu.com/s?id=1668393227924896391&wfr=spider&for=pc 一.DNS 是什么? ...

  9. 在matlab 画箭头

    [转载]在matlab 画箭头 原文地址:在matlab 画箭头作者:纯情小郎君 完整见链接http://www.mathworks.com/matlabcentral/fx_files/14056/ ...

  10. 手把手教你搭饥荒专用服务器(五)—MOD自动下载安装(Windows+Linux)

    想了解更详细内容,请点击原文地址:https://wuter.cn/1985.html/ 饥荒专用服务器的mod设置总共有两种方法. 方法一 在本地游戏中更新mod,然后把mod上传到服务器,但是这种 ...