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值來查詢對應的部落格。