之前沒有使用過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;
}
