####官網APIhtml
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
####spring data jpa接口結構圖spring
Repository:頂級接口,提供組建掃描 -|CrudRepository:提供增刪改查功能 -|PagingAndSortingRepository:分頁排序功能 -|JpaRepository:增長批量操做功能 JpaSpecificationExecutor:複雜查詢接口 Pageable:分頁接口 -|PageRequest:分頁實現類
####基於Repository接口的條件查詢,分頁,排序sql
// 兩個方式一致 @RepositoryDefinition(domainClass = Staff.class, idClass = Long.class) public interface StaffDao implements JpaRepository<Staff, Long> // 基於方法名解析 findByName select * from table t where t.name = ? // 方法名構造方法 find + 全局修飾 + By + 實體屬性名稱 + 限定詞 + 鏈接詞 + ...(其餘屬性) + OrderBy + 排序屬性 + 排序方向 全局修飾:Distinct(惟一)、Top(頭多少條)、First(頭多少條) 限定詞:IsNull、IsNotNull、Like、NotLike、Containing(%?%)、in、NotIn、IgnoreCase、Between、Equals、LessThan、GreaterThan、After、Befor... 鏈接詞:And、Or 排序方向:ASC、DESC 全局修飾: // Enables the distinct flag for the query List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<User> queryFirst10ByLastname(String lastname, Pageable pageable); Slice<User> findTop3ByLastname(String lastname, Pageable pageable); List<User> findFirst10ByLastname(String lastname, Sort sort); List<User> findTop10ByLastname(String lastname, Pageable pageable); // 嵌套實體方法命名規則 構詞法:主實體中子實體的名稱 + _ + 子實體的屬性名稱 Ex:List<Person> findByAddress_ZipCode(ZipCode zipCode); 表示查詢全部Address的zipCode爲指定值的全部Person // 分頁 jpa中,repository方法傳入new PageRequest(page, pageSize); // 排序 List<Order> orders = new ArrayList<Order>(); Order order = new Order(Direction.ASC, "id"); jpa中,repository方法傳入new Sort(Direction.ASC, "id"); new Sort(new Order()); new Sort(order); new Sort(orders); // JpaRepository直接使接口(計算字段isAudit爲固定值的條數) Long countByIsAudit(Integer isAudit);
####JpaSpecificationExecutor高級查詢dom
findAll(new Specification<T>(){ // Predicate查詢條件,組合查詢條件 @Override public Predicate toPredicate(Root<T> root, CriteriaQuery<T> cq, CriteriaBuilder cb){ // 查詢名稱中有"王"字的用戶 // 從root中獲取字段,並進行數據類型轉換 Predicate nameLike = cb.like(root.get("name").as(String.class), "%王%"); return nameLike; // 集合方式 List<Predicate> predicateList = new ArrayList<Predicate>(); PredicateList.add(cb.like(root.get("name").as(String.class), "%王%")); return cq.where(predicateList.toArray(new Predicate[predicateList.size()])).getRestriction(); } });
####基於Repository接口的方法註解查詢@Query與@基於實體類上NamedQueryide
// value可填JPQL或者nativeSQL // nativeQuery = true 表明用原生態sql進行編譯查詢 @Query(value = "SELECT u FROM User t WHERE t.name = :name", nativeQuery = true) List<User> findUserByName(@Param("name") String name); // 實體類添加註解 @NamedQuery(name="findUserByName", query="SELECT u FROM User u WHERE u.name=:name") @NamedQueries({ // 這裏能夠多個@NamedQuery }) // Dao實現類,注入EntityManager; Query query = entityManager.createNameQuery("findUserByName"); query.setParameter("name", "隔壁老王"); List<User> list = query.getResulLlist();
####查詢限定詞ui