关于spring-data与elasticsearch的使用,自定义repository
之前没有使用过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的更多相关文章
- Spring Data 整合 ElasticSearch搜索服务器
一.基于 maven 导入坐标(pom.xml文件) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...
- Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...
- Spring Data与elasticsearch版本对应关系
- Spring Data Jpa 使用@Query标注自定义查询语句
https://blog.csdn.net/daniel7443/article/details/51159865 https://blog.csdn.net/pp_fzp/article/detai ...
- Spring Data Elasticsearch 用户指南
https://www.jianshu.com/p/27e1d583aafb 翻译自官方文档英文版,有删减. BioMed Central Development Team version 2.1.3 ...
- 3.4_springboot2.x整合spring Data Elasticsearch
Spring Data Elasticsearch 是spring data对elasticsearch进行的封装. 这里有两种方式操作elasticsearch: 1.使用Elasticsearch ...
- Spring Data ElasticSearch的使用
1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...
- 将自定义功能添加到Spring Data Repository
Spring Data非常方便,可以加快开发速度,避免使用样板代码. 但是,在某些情况下,注释查询不足,而无法达到您可能希望实现的自定义功能. 因此,Spring Data允许我们向Spring Da ...
- Spring Data Commons 官方文档学习
Spring Data Commons 官方文档学习 -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...
- Spring Data JPA(官方文档翻译)
关于本书 介绍 关于这本指南 第一章 前言 第二章 新增及注意点 第三章 项目依赖 第四章 使用Spring Data Repositories 4.1 核心概念 4.2 查询方法 4.3 定义rep ...
随机推荐
- Linux安装Mysql8.0.11
0. 安装环境 1. 下载安装包 方式一:百度网盘下载 链接:https://pan.baidu.com/s/11t_JXUp-SXRaioNDvdltNg 提取码:uzyj 方式二:在线下载 1 ...
- ssh-copy-id三步实现SSH免密登录
背景 在日常工作中,不希望每次登录都输入密码,这里主要介绍一种简单的配置Linux主机间免密登录的方式 先了解两个核心命令: ssh-keygen :产生公钥和私钥对 ssh-copy-id:将北极的 ...
- GET和POST的区别与联系
每日知识-GET和POST HTTP:超文本传输协议 组成部分:请求行,请求头部,一个空行,请求数据 GET和POST GET:get就是获取的意思,默认的HTTP请求方式,把参数通过 key/val ...
- C#实现SHA256WithRSA加密用于Java的秘钥私钥
首先要把Java秘钥进行转换,然后再进行加密 转制秘钥的方法 public static string RSAPrivateKeyJava2DotNet(string privateKey) { Rs ...
- Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
hive安装时遇到的问题 解压后指定了hive-env.sh文件的Hadoop_home & hive_conf 两个参数后,先直接bin/hive 用Derby数据库启动一下,然后再配置其 ...
- vue第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法)
第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法) #课程目标 了解 vue 框架的特点 掌握创建 vue 实例 掌握 data ...
- 小白都能理解的Python多继承
本文主要做科普用,在真实编程中不建议使用多重继承,或者少用多重继承,避免使代码难以理解. 方法解析顺序(MRO) 关于多重继承,比较重要的是它的方法解析顺序(可以理解为类的搜索顺序),即MRO.这个跟 ...
- 6 个例子教你重构 Python 代码
1. 合并嵌套的 if 条件 太多的嵌套会使代码难以理解,这在 Python 中尤为如此,因为 Python 没有括号来帮助区隔不同的嵌套级别. 阅读深度嵌套的代码容易让人烦躁,因为你必须理清哪些条件 ...
- 寻找两个数组中的公共元素Java程序代码
package lianxi; import java.util.*; public class UnionSearch { public static void main(String[] args ...
- 手把手教你搭饥荒专用服务器(五)—MOD自动下载安装(Windows+Linux)
想了解更详细内容,请点击原文地址:https://wuter.cn/1985.html/ 饥荒专用服务器的mod设置总共有两种方法. 方法一 在本地游戏中更新mod,然后把mod上传到服务器,但是这种 ...