關於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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM