簡體   English   中英

如何實現CrudRepository的自定義方法?

[英]How to implement custom methods for CrudRepository?

我想創建一個RepositoryItemWriter並提供一個自定義的CrudRepository方法。

問題: CrudRepository是一個接口,如果我在public class實現它,則必須顯式實現所有方法。

因此,如何在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還具有一個命名約定,可用於創建自定義搜索/查找方法。 例如,如果我的人員對象具有firstName和lastName,則可以創建以下方法接口,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的存儲庫接口上起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM