最近項目用Spring-data-jpa,確實很方便。如果你也曾經被重復無聊的dao代碼雷到的話,就可以考慮將ORM framework換成spring-data-jpa了。 只要繼承CrudRepository或者PagingAndSortingRepository,dao層基本上就只剩下定義接口方法這么一件事情了,連實現都不用寫,因為默認實現SimpleJpaRepository已經幫你實現了基本的CRUD,是不是很方便?基本的CRUD就全解決了。
廢話少說,上代碼:
2 | public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID>{ |
7 | public interface TestRepository extends BaseRepository<Test,Long>{ |
8 | Test findByName(String name); |
只需這么定義,然后testRepository對象就天然擁有CRUD的方法,它會動態將findByName()的方法定義翻譯成適當的HQL。
02 | public class TestServiceImpl{ |
04 | private TestRepository testRepository; |
06 | testRepository.findOne(id); |
07 | testRepository.findAll(ids); |
08 | testRepository.delete(id); |
09 | testRepository.findByName(name); |
各種翻譯規則可細看官方文檔。
而且還可以用@Query的注解。在方法中寫JPQL查詢語句,還支持nativeQuery,可以使用原生SQL,對報表之類對性能要求比較高的查詢就很給力了。
如果有時候只是想查詢實體中的某幾個字段,而不是整張表都查詢出來,可以采用以下方法
2 | public interface TestRepository extends BaseRepository<Test,Long>{ |
4 | @Query ( "select t.id, t.name from Test t" ) |
5 | public List<Object[]> findSimpleTest() |
然后在調用該repository的service中遍歷將對應的字段轉換為相應的字段即可。
具體可以看官方reference
如果SimpleJpaRepository中的方法不夠用,擴展起來也非常方便,只要在BaseRepository定義自己的借口方法,然后實現類繼承SimpleJpaRepository實現自己的方法,然后將jpa的factory-class替換成自己寫的實現類即可。
當然spring data jpa也有criteria實現,叫Specification,有自己的語法,就一個接口方法,多表關聯復雜條件查詢很多時候就需要用到這個,還沒細研究。再議。