spring-data-jpa

####官網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

輸入圖片說明

輸入圖片說明

輸入圖片說明

相關文章
相關標籤/搜索