gpt4 book ai didi

java - 如何实现 CrudRepository 的自定义方法?

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:09 51 4
gpt4 key购买 nike

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

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

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

    @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> {
}

最佳答案

您有多种选项可用于自定义 Spring Data 方法和存储库。

如果您使用 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;
}
}

如果您使用 Spring Data Rest,那么您可以使用“覆盖”或替换您想要自定义的路径的请求映射来创建自己的 RepositoryRestController。

package com.example;

import org.springframework.data.rest.webmvc.RepositoryRestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RepositoryRestController
public class SampleController {

@RequestMapping(path = "/sample", method = RequestMethod.DELETE)
public void delete(Long deleteMe){

System.out.println("RepositoryRestController CALLED for "+deleteMe);
}
}

您可以使用@Query注释创建一些自定义查询方法。

@Override
@Query(value = "SELECT DISTINCT count(*) FROM SAMPLE_DISTINCT")
long count();

Spring Data Rest 还有一个命名约定,您可以使用它来创建自定义搜索/findby 方法。例如,如果我的 person 对象有一个名字和一个姓氏,我可以创建以下方法接口(interface),Spring Boot 将为我实现它们。

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...

这也应该适用于为 data-rest 和 data-mongodb 声明的存储库接口(interface)。

关于java - 如何实现 CrudRepository 的自定义方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26890984/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com