亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring data jpa的使用方法

發布時間:2020-11-02 15:00:18 來源:億速云 閱讀:179 作者:Leah 欄目:開發技術

Spring data jpa的使用方法?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、 使用Specification實現復雜查詢

(1) 什么是Specification

Specification是springDateJpa中的一個接口,他是用于當jpa的一些基本CRUD操作的擴展,可以把他理解成一個spring jpa的復雜查詢接口。其次我們需要了解Criteria 查詢,這是是一種類型安全和更面向對象的查詢。而Spring Data JPA支持JPA2.0的Criteria查詢,相應的接口是JpaSpecificationExecutor。

而JpaSpecificationExecutor這個接口基本是圍繞著Specification接口來定義的,Specification接口中只定義了如下一個方法:

Predicate toPredicate(Root<T> root, CriteriaQuery<&#63;> query, CriteriaBuilder cb); 

Criteria查詢基本概念:

Criteria 查詢是以元模型的概念為基礎的,元模型是為具體持久化單元的受管實體定義的,這些實體可以是實體類,嵌入類或者映射的父類。

CriteriaQuery接口:

代表一個specific的頂層查詢對象,它包含著查詢的各個部分,比如:select 、from、where、group by、order by等注意:CriteriaQuery對象只對實體類型或嵌入式類型的Criteria查詢起作用。

Root:

代表Criteria查詢的根對象,Criteria查詢的查詢根定義了實體類型,能為將來導航獲得想要的結果,它與SQL查詢中的FROM子句類似。
Root實例是類型化的,且定義了查詢的FROM子句中能夠出現的類型。root代表查詢的實體類,query可以從中得到root對象,告訴jpa查詢哪一個實體類,還可以添加查詢條件,還可以結合EntityManager對象 得到最終查詢的 TypedQuery對象。

CriteriaBuilder接口:

用來構建CritiaQuery的構建器對象Predicate:一個簡單或復雜的謂詞類型,其實就相當于條件或者是條件組合。 可通過 EntityManager.getCriteriaBuilder 而得。

二、使用Specification進行復雜的動態查詢

maven的依賴繼續使用上一章的就可以,這里修改一下實體類和controller層。

請求實體類:

@Data
public class AccountRequest {

  //從第幾頁開始
  private Integer page;

  //每一頁查詢多少
  private Integer limit;

  private String id;

  private String name;

  private String pwd;

  private String email;

  private Integer[] types;

}

實體類:

@Data
@Entity
@Table(name = "account")
@ToString
@EntityListeners(AuditingEntityListener.class)
public class Account {

  @Id
  @GenericGenerator(name = "idGenerator", strategy = "uuid")
  @GeneratedValue(generator = "idGenerator")
  private String id;

  @Column(name = "username", unique = true, nullable = false, length = 64)
  private String username;

  @Column(name = "password", nullable = false, length = 64)
  private String password;

  @Column(name = "email", length = 64)
  private String email;

  @Column(name = "type")
  private Short type;

  @CreatedDate
  @Column(name = "create_time", nullable = false)
  private LocalDateTime createTime;

}

Repository層:

public interface AccountRepository extends JpaRepository<Account,String>, JpaSpecificationExecutor<Account> {}

controller層(還是直接略過service層)

@Autowired
  private AccountRepository repository;


  @PostMapping("/get")
  public List<Account> get(@RequestBody AccountRequest request){
    Specification<Account> specification = new Specification<Account>() {

      @Override
      public Predicate toPredicate(Root<Account> root, CriteriaQuery<&#63;> criteriaQuery, CriteriaBuilder builder) {
        //所有的斷言 及條件
        List<Predicate> predicates = new ArrayList<>();
        //精確匹配id pwd
        if (request.getId() != null) {
          predicates.add(builder.equal(root.get("id"), request.getId()));
        }
        if (request.getPwd() != null) {
          predicates.add(builder.equal(root.get("password"), request.getPwd()));
        }
        //模糊搜索 name
        if (request.getName() != null && !request.getName().equals("")) {
          predicates.add(builder.like(root.get("username"), "%" + request.getName() + "%"));
        }
        if (request.getEmail() != null && !request.getEmail().equals("")) {
          predicates.add(builder.like(root.get("email"), "%" + request.getEmail() + "%"));
        }
        //in范圍查詢
        if (request.getTypes() != null) {
          CriteriaBuilder.In<Object> types = builder.in(root.get("type"));
          for (Integer type : request.getTypes()) {
            types = types.value(type);
          }
          predicates.add(types);
        }
        return builder.and(predicates.toArray(new Predicate[predicates.size()]));
      }
    };
    List<Account> accounts = repository.findAll(specification);

    return accounts;
  }

通過重寫Specification的toPredicate的方法,這樣一個復雜的動態sql查詢就完成了,通過post請求直接就可以調用了。

三、分頁及排序

@PostMapping("/page")
  public List<Account> getPage(@RequestBody AccountRequest request){

    Specification<Account> specification = new Specification<Account>() {
      @Override
      public Predicate toPredicate(Root<Account> root, CriteriaQuery<&#63;> criteriaQuery, CriteriaBuilder criteriaBuilder) {
        List<Predicate> predicates = new ArrayList<>();
        //do anything
        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
      }
    };
    //表示通過createTime進行 ASC排序
    PageRequest page = new PageRequest(request.getPage() - 1, request.getLimit(), Sort.Direction.ASC, "createTime");
    Page<Account> pageInfo = repository.findAll(specification, page);

    return pageInfo.getContent();
  }

上面的代碼是在經過復雜查詢并進行分頁與排序,通過PageRequest來構建分頁排序的規則。傳入起始頁及每頁的數量,還有排序的規則及以哪個屬性排序。jpa中是以第0頁開始的,所以傳參的時候需要注意!

當然,如果你不需要進行復雜的查詢也可以對數據進行分頁及排序查詢。

修改repository,使其繼承PagingAndSortingRepository。

@Repository
public interface AccountRepository extends JpaRepository<Account,String>, JpaSpecificationExecutor<Account> , PagingAndSortingRepository<Account,String> {
  Page<Account> findByAge(int age, Pageable pageable);
}

使用時先創建pageable參數,然后傳進去就可以了。

//顯示第1頁每頁顯示3條
PageRequest pr = new PageRequest(1,3);
//根據年齡進行查詢
Page<Account> stus = accountPageRepository.findByAge(22,pr); 
 

排序也是一樣的,在repository中創建方法

List<Account> findByPwd(String pwd, Sort sort);

調用的時候傳入sort對象

//設置排序方式為username降序
List<Account> accs = accountPageRepository.findByAge("123456",new Sort(Sort.Direction.DESC,"username"));
//設置排序以username和type進行升序
acc = accountPageRepository.findByAge("123456",new Sort(Sort.Direction.ASC,"username","type"));
//設置排序方式以name升序,以address降序
Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC,"name"),new Sort.Order(Sort.Direction.DESC,"type"));
accs = accountPageRepository.findByAge("123456",sort);

關于Spring data jpa的使用方法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武强县| 溆浦县| 雅江县| 山西省| 长子县| 洪雅县| 靖安县| 顺平县| 汶上县| 三原县| 海宁市| 新丰县| 金平| 勃利县| 资兴市| 容城县| 鹤岗市| 江门市| 类乌齐县| 富川| 融水| 楚雄市| 水城县| 永福县| 遂平县| 会泽县| 桂东县| 诸暨市| 云林县| 桃江县| 抚顺市| 庆阳市| 闽清县| 沁水县| 浠水县| 永济市| 普格县| 仙游县| 德江县| 五家渠市| 米易县|