欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Data?JPA系列JpaSpecificationExecutor用法詳解

 更新時(shí)間:2022年09月28日 15:47:37   作者:AKone  
這篇文章主要為大家介紹了Spring?Data?JPA系列JpaSpecificationExecutor用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

在上一篇文章中,我們介紹了QueryByExampleExecutor動(dòng)態(tài)查詢的方法,那么今天我們來(lái)學(xué)習(xí)JpaSpecificationExecutor的詳細(xì)用法。

1、JpaSpecificationExecutor用法

我們來(lái)創(chuàng)建實(shí)體類(lèi),第一步:創(chuàng)建User類(lèi)和UserAddress類(lèi)

// User類(lèi)
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString(exclude = "address")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private String email;
    @Enumerated(value = EnumType.STRING)
    private SexEnum sex;
    private Integer age;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    @OneToMany(mappedBy = "user",fetch = FetchType.EAGER)
    private List<UserAddress> address;
}
// Address類(lèi)
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "user")
public class UserAddress {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String address;
    @ManyToOne(cascade = CascadeType.ALL)
    private User user;
}
// 性別枚舉類(lèi)
public enum SexEnum {
    BOY,
    GIRL
}

第二步:創(chuàng)建UserRepo ,我們繼承JpaSpecificationExecutor接口

public interface UserRepo extends JpaSpecificationExecutor<User> {
}

第三步:測(cè)試,構(gòu)造查詢條件

  • name模糊查詢
  • sex精準(zhǔn)查詢
  • age范圍查詢
  • address的in查詢
    @Test
    public void test02(){
        User userQuery = User.builder()
                .name("jack")
                .email("123456@126.com")
                .sex(SexEnum.BOY)
                .age(20)
                .address(Lists.newArrayList(UserAddress.builder().address("shanghai").build()))
                .build();
        List<User> userList = userRepo.findAll(new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicateList = new ArrayList<>();
                // name模糊查詢
                if(StringUtils.isNotBlank(userQuery.getName())) {
                    predicateList.add(cb.like(root.get("name"),userQuery.getName()));
                }
                // sex精準(zhǔn)查詢
                if(userQuery.getSex()!=null) {
                    predicateList.add(cb.equal(root.get("sex"),userQuery.getSex()));
                }
                // age范圍查詢
                if(userQuery.getAge()!=null){
                    predicateList.add(cb.greaterThanOrEqualTo(root.get("age"),userQuery.getAge()));
                }
                // 關(guān)聯(lián)查詢
                if(!ObjectUtils.isEmpty(userQuery.getAddress())) {
                    predicateList.add(cb.in(root.join("address").get("address")).value(userQuery.getAddress().stream().map(a->a.getAddress()).collect(Collectors.toList())));
                }
                return query.where(predicateList.toArray(new Predicate[predicateList.size()])).getRestriction();
            }
        });
        System.out.println(userList);
    }

SQL執(zhí)行結(jié)果如下:

select user0_.id as id1_4_, user0_.age as age2_4_, user0_.create_time as create_t3_4_, user0_.email as email4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.update_time as update_t7_4_ from user user0_ inner join user_address address1_ on user0_.id=address1_.user_id where (user0_.name like ?) and user0_.sex=? and user0_.age>=20 and (address1_.address in (?))

2、JpaSpecificationExecutor語(yǔ)法詳解

先看源碼:

public interface JpaSpecificationExecutor<T> {
   Optional<T> findOne(@Nullable Specification<T> spec);
   List<T> findAll(@Nullable Specification<T> spec);
   Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);
   List<T> findAll(@Nullable Specification<T> spec, Sort sort);
   long count(@Nullable Specification<T> spec);
   boolean exists(Specification<T> spec);
}
  • findOne(@Nullable Specification spec):根據(jù)Specification 條件查詢單個(gè)對(duì)象
  • findAll(@Nullable Specification spec):根據(jù)Specification 條件, 查詢List結(jié)果
  • findAll(@Nullable Specification spec, Pageable pageable):根據(jù)Specification 條件, 分頁(yè)查詢
  • findAll(@Nullable Specification spec, Sort sort):根據(jù)Specification 條件,帶排序的查詢結(jié)果
  • count(@Nullable Specification spec): 根據(jù)Specification 條件,查詢數(shù)量
  • exists(Specification spec):根據(jù)Specification 條件,查詢是否存在

2.1 Specification 接口

我們主要來(lái)看一下需要實(shí)現(xiàn)的方法:toPredicate(xx,xx,xx)

@Nullable
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);

調(diào)試代碼

我們可以分別看到Root的實(shí)現(xiàn)類(lèi)是RootImpl,CriteriaQuery的實(shí)現(xiàn)類(lèi)是CriteriaQueryImpl,CriteriaBuilder的實(shí)現(xiàn)類(lèi)是CriteriaBuilderImpl。這三個(gè)實(shí)現(xiàn)類(lèi)都是由Hibernate實(shí)現(xiàn),也就是說(shuō)JpaSepcificationExecutor封裝了原本需要我們直接操作Hibernate中Criteria的API。

2.2 Root< User >root

解釋?zhuān)哼@個(gè)root就相當(dāng)于查詢和操作的實(shí)體對(duì)象的根,我們就可以通過(guò)Path get(xx)的方法,來(lái)獲取我們想要操作的字段。

<Y> Path<Y> get(String attributeName);

例如:獲取User實(shí)體類(lèi)中的name字段

predicateList.add(cb.like(root.get("name"),userQuery.getName()));

2.3 CriteriaQuery<?> query

這是一個(gè)Specific的頂層查詢對(duì)象,它包含著查詢的各個(gè)部分,比如select、from、where、group by 、Order by、distinct等。提供查詢Root的方法,我們來(lái)看一下源碼:

我們可以在上面的案例中看到query的用法:

return query.where(predicateList.toArray(new Predicate[predicateList.size()])).getRestriction();

我們可以再加一個(gè)groupBy的例子看看,如下所示:可以鏈?zhǔn)狡唇?/p>

return query.where(predicateList.toArray(new Predicate[predicateList.size()])).groupBy(root.get("age")).getRestriction();

執(zhí)行的SQL如下所示:

2.4 CriteriaBuilder cb

CriteriaBuilder是用來(lái)構(gòu)建CritiaQuery的構(gòu)建對(duì)象,其實(shí)就相當(dāng)于條件或者條件組合,并以Predicate的形式返回,基本提供了所有常用的方法。

通過(guò)源碼我們可以看到CriteriaBuilder 提供了and、any等用來(lái)查詢條件的組合;還提供了between、equal、exist等用來(lái)做查詢條件的查詢。

例如:equal

predicateList.add(cb.equal(root.get("sex"),userQuery.getSex()));

例如:like

predicateList.add(cb.like(root.get("name"),userQuery.getName()));

例如:greaterThanEqualTo

predicateList.add(cb.greaterThanOrEqualTo(root.get("age"),userQuery.getAge()));

解釋: 我們利用equal、like、greaterThanEqualTo 可以返回Predicate,而Predicate又可以組合起來(lái),就構(gòu)成了復(fù)雜的查詢條件,完全滿足日常開(kāi)發(fā)使用。

以上就是Spring Data JPA系列JpaSpecificationExecutor用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring Data JPA JpaSpecificationExecutor的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式

    OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式

    這篇文章主要介紹了OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄

    springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄

    SpringBoot對(duì)數(shù)據(jù)庫(kù)操作有多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot整合mybatis實(shí)現(xiàn)多表查詢的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Java實(shí)現(xiàn)讀取及生成Excel文件的方法

    Java實(shí)現(xiàn)讀取及生成Excel文件的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)讀取及生成Excel文件的方法,結(jié)合實(shí)例形式分析了java通過(guò)引入第三方j(luò)ar包poi-3.0.1-FINAL-20070705.jar實(shí)現(xiàn)針對(duì)Excel文件的讀取及生成功能,需要的朋友可以參考下
    2017-12-12
  • SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解

    SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解

    這篇文章主要介紹了SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,可對(duì)controller進(jìn)行增強(qiáng)處理,需要的朋友可以參考下
    2023-10-10
  • java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的加減乘除計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Maven構(gòu)建時(shí)跳過(guò)部分測(cè)試的實(shí)例

    Maven構(gòu)建時(shí)跳過(guò)部分測(cè)試的實(shí)例

    下面小編就為大家分享一篇Maven構(gòu)建時(shí)跳過(guò)部分測(cè)試的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • JavaMe開(kāi)發(fā)自適應(yīng)滾動(dòng)顯示

    JavaMe開(kāi)發(fā)自適應(yīng)滾動(dòng)顯示

    我們常看到一些滾動(dòng)顯示的實(shí)例,比如UC瀏覽器中,顯示網(wǎng)頁(yè)的內(nèi)容。當(dāng)內(nèi)容比較多時(shí),采用滾動(dòng)分頁(yè)顯示是合理的。在Canvas中繪圖中,多余的內(nèi)容被截?cái)嗔?。如何?shí)現(xiàn)滾動(dòng)分頁(yè)顯示呢?
    2015-09-09
  • Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法

    Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法

    這篇文章主要介紹了Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2016-12-12
  • Java中Comparator與Comparable排序的區(qū)別詳解

    Java中Comparator與Comparable排序的區(qū)別詳解

    這篇文章主要介紹了Java中Comparator與Comparable排序的區(qū)別詳解,如果你有一個(gè)類(lèi),希望支持同類(lèi)型的自定義比較策略,可以實(shí)現(xiàn)接口Comparable,如果某個(gè)類(lèi),沒(méi)有實(shí)現(xiàn)Comparable,但是又希望對(duì)它進(jìn)行比較,則可以自定義一個(gè)Comparator,需要的朋友可以參考下
    2024-01-01
  • shade解決mybatis包沖突問(wèn)題

    shade解決mybatis包沖突問(wèn)題

    這篇文章主要介紹了shade解決mybatis包沖突問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論