1. 程式人生 > 實用技巧 >Spring JPA 核心概念

Spring JPA 核心概念

Spring JPA 核心概念

翻譯: Core concepts
Spring資料儲存庫抽象中的中心介面是repository。它採用要管理的域類以及域類的ID型別作為型別引數。此介面主要充當標記介面,以捕獲要使用的型別,並幫助您發現擴充套件此介面的介面。CrudRepository為被管理的實體類提供了複雜的CRUD功能。

例3:CrudRepository 介面

public interface CrudRepository<T, ID> extends Repository<T, ID> {

  <S extends T> S save(S entity);      //儲存指定的實體

  Optional<T> findById(ID primaryKey); //返回給定id的實體

  Iterable<T> findAll();               //返回所有實體

  long count();                        //統計實體個數

  void delete(T entity);               //刪除給定的實體

  boolean existsById(ID primaryKey);   //判斷給定id的實體是否存在

  // … more functionality omitted.
}

我們還提供特定於永續性技術的抽象,例如JpaRepositoryMongoRepository。這些介面擴充套件了CrudRepository,在CrudRepository的通用介面外,還增加拓展了公開了其他基礎永續性技術的介面功能。

​ 在CrudRepository之上,有一個PagingAndSortingRepository抽象介面,它添加了其他方法來簡化對實體的分頁訪問:

例4:PagingAndSortingRepository介面

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

​ 獲取頁面大小為20的user實體列表第二頁的程式碼如下所示:

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(PageRequest.of(1, 20));

注:Page從0開始

​ 除了查詢方法之外,還可以使用計數和刪除查詢的查詢派生。以下列表顯示派生計數查詢的介面定義:

例5:計數查詢派生

interface UserRepository extends CrudRepository<User, Long> {

  long countByLastname(String lastname);
}

​ 以下列表顯示了派生的刪除查詢的介面定義:

例6:刪除查詢派生

interface UserRepository extends CrudRepository<User, Long> {

  long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);
}

附註:SpringBoot 專案分頁查詢Demo

Dao

public interface ShipDao extends JpaRepository<ShipPO,Integer> {  
    Page<ShipPO> findByRegion(String region,Pageable pageable);  
}

Service

@RequestMapping(value = "/ship",method = RequestMethod.GET)
    public List<ShipPO> GetShip( 
            @RequestParam(value = "region",required = false,defaultValue = "none") String region
    ){
            Pageable pageable = PageRequest.of(page,5, Sort.by(Sort.Direction.DESC,"sdate"));
            //無區域限制
                //根據地區查詢,有地區限制 無狀態限制
            shiplist = shipDao.findByRegion(region,pageable).get().collect(Collectors.toList());

        return shiplist;
    }