1. 程式人生 > >Spring Data JPA: 為單個Repository新增自定義方法

Spring Data JPA: 為單個Repository新增自定義方法

我們在Spring Data JPA: 為所有Repository新增自定義方法中學習了通過JpaRepositoryFactory來為所有Repository新增一個公共的方法以及實現。但在很多情況下,我們需要為某個單獨的Repository新增一個自定義的方法,並使其擁有一個自定義的實現。我們現在就來學習一下如何為某個單獨的Repository新增自定義方法

定義Entry以及Repository

我們繼續沿用之前Blog的例子,只需要一個基本的Entry物件以及Repositor即可:

@Entity
public class Blog {

    @Id
    @GeneratedValue
(strategy = GenerationType.AUTO)
private Integer id; private String title; @Lob @Basic(fetch = FetchType.LAZY) @Column(length = 1024 * 1024) private String content; ...... }

自定義Repository介面

首先我們依然需要新增一個自定義的介面,該介面定義了我們自定義的方法,這裡我們自定義一個searchTitle方法,表示通過某個key來搜尋所有部落格的title:

public interface CustomRepository {

    List<Blog> searchTitle(String key);

}

繼承CustomRepository介面

然後,我們需要使BlogRepository繼承CustomRepository

public interface BlogRepository extends JpaRepository<Blog, Integer>, CustomRepository {
}

實現CustomRepository介面

既然是自定義的方法,就需要我們自己去實現該方法。由於我們需要為

BlogRepository新增自定義方法,Spring Data Jpa會自動的去尋找類名為BlogRepositoryImpl的類作為自定義方法的實現(如果有兩個以上類名為BlogRepositoryImpl的類,Spring Data Jpa會丟擲錯誤)

public class BlogRepositoryImpl implements CustomRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Blog> searchTitle(String key) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Blog> query = builder.createQuery(Blog.class);
        Root<Blog> root = query.from(Blog.class);
        query.where(builder.like(root.get("title"), "%" + key + "%"));
        return em.createQuery(query.select(root)).getResultList();
    }

}

注:我們可以通過@EnableJpaRepositories(repositoryImplementationPostfix="Custom")來更改具體實現的字尾,我們這樣設定後,相應的實現類應該為BlogRepositoryCustom

新增測試資料

為了方便測試,我們需要在應用啟動的時候為資料庫新增一些測試資料。這裡我們利用@Component@PostConstruct兩個標註來實現。@Component標註會使得應用啟動時自動的例項化一個型別為DataInit的Bean。@PostConstruct使得該Bean例項化完成後自動的呼叫被標註的方法。這裡我們僅僅新增一條資料用來測試:

@Component
public class DataInit {

    private static final Logger logger = LoggerFactory.getLogger(DataInit.class);

    @Autowired BlogRepository blogRepository;

    @PostConstruct
    public void dataInit(){
        Blog blog = new Blog();
        blog.setContent("this is blog content");
        blog.setTitle("blog");
        blog = blogRepository.save(blog);
        logger.debug("id is {}", blog.getId());

    }

}

測試

我們添加了一個TestController進行測試。進入根目錄,執行mvn spring-boot:run可以執行我們的應用。

應用啟動後,訪問http://localhost:8080/search?key=blog即可通過key值來查詢對應的部落格。