之前没有使用过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;
}

最新文章

  1. SE Springer小组之《Spring音乐播放器》可行性研究报告三、四
  2. QT显示中文的几个问题
  3. PO_PO系列 - 收货管理分析(案例)
  4. 通过Messenger与后台连接(单向操作,activity向service发送数据)
  5. 【转】gcc中-pthread和-lpthread的区别
  6. &lt;转&gt;一道面试题比较synchronized和读写锁
  7. 自己开发开源jquery插件--给jquery.treeview加上checkbox
  8. 《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)
  9. (DT系列四)驱动加载中, 如何取得device tree中的属性
  10. 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data
  11. Ubuntu 12.04 下安装配置 JDK 7(tar)
  12. SRM 405(1-250pt, 1-500pt)
  13. linux telnet服务安装与配置
  14. python 基础学习2--编程
  15. android cordova h5总结
  16. systemd的作用
  17. Struts 2 之 OGNL
  18. linux 完全关闭tomcat
  19. leetcode 103
  20. ARX工程必须使用release模式编译

热门文章

  1. Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?
  2. JavaSE14-集合&#183;其一
  3. Unity射击游戏实例—物理碰撞的实现
  4. iNeuOS工业互联平台,图表与数据点组合成新组件,进行项目复用
  5. 【python爬虫】一个简单的爬取百家号文章的小爬虫
  6. 篇章三:SVN-对文件的操作
  7. intellij IDEA Mybatis入门案例
  8. python之scrapy篇(三)
  9. Spring Cloud Hystrix应用篇(十一)
  10. Atcoder abc187 F Close Group(动态规划)