之前没有使用过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. rsync 参数说明及使用参数笔记

    第1章 rsync 命令简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据镜像同步备份的优秀工具. 1.1.1 语法格式 三种模式: 1)本地模式 rsync [选项] ...

  2. 使用tkinter打造一个小说下载器,想看什么小说,就下什么

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  3. proxySQL with SemiSync

    环境信息 hostname IP port role comm ms81 192.168.188.81 3399 master ms82 192.168.188.82 3399 slave ms83 ...

  4. Electron安装打包指南

    当前环境Debian Linux-Deepin 安装Node 直接下载 命令下载 下载 wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linu ...

  5. rancher安装,快速安装

    apt-get install docker.io docker -y docker run -d --restart=always -v /data/rancher_server:/var/lib/ ...

  6. create-react-app 基于TS的项目

    写在前面 最近在用React,发现百度了很多都没有找到基于TS的React项目搭建,很多是老的方法已经属于不成功的了,今天我把最新的搭建基于ts的React的项目分享出来 create-react-a ...

  7. 怎么确定一个Flink job的资源

    怎么确定一个Flink job的资源 Slots && parallelism 一个算子的parallelism 是5 ,那么这个算子就需要5个slot, 公式 :一个算子的paral ...

  8. 简单学习 SQL and NOSql

    文章参考链接::https://www.cnblogs.com/xrq730/p/11039384.html 结构化数据.非结构化数据与半结构化数据 文章的开始,聊一下结构化数据.非结构化数据与半结构 ...

  9. 第九章 Nacos Config--服务配置

    今天咱们接着 上一篇 第八章 SMS–短信服务 继续写 SpringCloud Alibaba全家桶 -> 第九章 Nacos Config–服务配置,废话不多说,开干 9.1 服务配置中心介绍 ...

  10. Pygal之掷骰子

    python之使用pygal模拟掷骰子创建直方图: 1,文件die.py,源码如下: 1 from random import randint 2 3 class Die(): 4 '''表示一个骰子 ...