Java 如何实现Crudepository的自定义方法?

Java 如何实现Crudepository的自定义方法?,java,spring,jpa,spring-batch,spring-data-jpa,Java,Spring,Jpa,Spring Batch,Spring Data Jpa,我想创建一个RepositoryItemWriter并提供一个自定义crudepository方法 问题:crudepository是一个接口,如果我在公共类中实现它,那么我必须显式实现所有方法 那么,如何在crudepository中创建自定义方法实现呢 @Autowired private MyEntityRepository repository; @Override public ItemWriter<PricingCache> temWri

我想创建一个
RepositoryItemWriter
并提供一个自定义
crudepository
方法

问题:
crudepository
是一个接口,如果我在
公共类中实现它,那么我必须显式实现所有方法

那么,如何在
crudepository
中创建自定义方法实现呢

    @Autowired
    private MyEntityRepository repository;

    @Override
    public ItemWriter<PricingCache> temWriter() {
        RepositoryItemWriter<MyEntity> writer = new RepositoryItemWriter<>();
        writer.setRepository(repository); //expects a CrudRepository
        writer.setMethodName("save"); //how to change this to a custom method? eg firstValidatenThenSave()
        return writer;
    }

public interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
}
@Autowired
私人髓质保存库;
@凌驾
公共项目编写器temWriter(){
RepositoryItemWriter writer=新的RepositoryItemWriter();
writer.setRepository(repository);//需要一个CrudRepository
writer.setMethodName(“save”);//如何将其更改为自定义方法?例如firstValidatenThenSave()
返回作者;
}
公共接口MyEntityRepository扩展了Crudepository{
}

您有几个选项可用于定制Spring数据方法和存储库

如果您使用的是Java8,那么可以在接口上提供一个“默认”方法

package com.example;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import java.util.UUID;

@RepositoryRestResource(path = "sample", collectionResourceRel = "sample")
public interface SampleRepository extends CrudRepository<Sample, Long> {

    @Override
    default Sample save(Sample sample) {

        System.out.println("DEFAULT SAVE CALLED!!");
        sample = new Sample();
        sample.setId(System.currentTimeMillis());
        sample.setWhatever("stuff");
        return sample;
    }

    @Override
    default Sample findOne(Long id){

        System.out.println("DEFAULT FIND CALLED!!");

        Sample sample = new Sample();
        sample.setId(id);
        sample.setWhatever(UUID.randomUUID().toString());

        return sample;
    }
}
您可以使用@query注释创建一些自定义查询方法

@Override
@Query(value = "SELECT DISTINCT count(*) FROM SAMPLE_DISTINCT")
long count();
SpringDataREST还有一个命名约定,您可以使用它来创建自定义搜索/findby方法。例如,如果我的person对象有一个firstName和一个lastName,我可以创建以下方法接口,springboot将为我实现它们

List<Person> findByFirstName(String firstName);
List<Person> findByFirstNameStartsWith(String firstName);
List<Person> findByFirstNameEndsWith(String firstName);
List<Person> findByFirstNameContains(String firstName);

List<Person> findByLastName(String lastName);
List<Person> findByLastNameStartsWith(String lastName);
List<Person> findByLastNameEndsWith(String lastName);
List<Person> findByLastNameContains(String lastName);

List<Person> findByFirstNameAndLastName(String firstName, String lastName);
List<Person> findByFirstNameContainsAndLastNameContains(String firstName, String lastName);
//etc...
列出findByFirstName(字符串名);
列出FindByFirstNamesStartSwith(字符串名);
列出findByFirstNameEndsWith(字符串名);
列表findByFirstNameContains(字符串名);
列出findByLastName(字符串lastName);
列出FindBylastNamesStartSwith(字符串lastName);
列出findByLastNameEndsWith(字符串lastName);
列表findByLastNameContains(字符串lastName);
列出FindByFirstName和lastName(字符串firstName、字符串lastName);
列出FindByFirstNameContains和LastNameContains(String firstName,String lastName);
//等等。。。
这也适用于为DataREST和DataMongoDB声明的存储库接口

List<Person> findByFirstName(String firstName);
List<Person> findByFirstNameStartsWith(String firstName);
List<Person> findByFirstNameEndsWith(String firstName);
List<Person> findByFirstNameContains(String firstName);

List<Person> findByLastName(String lastName);
List<Person> findByLastNameStartsWith(String lastName);
List<Person> findByLastNameEndsWith(String lastName);
List<Person> findByLastNameContains(String lastName);

List<Person> findByFirstNameAndLastName(String firstName, String lastName);
List<Person> findByFirstNameContainsAndLastNameContains(String firstName, String lastName);
//etc...