国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring Data JPA中的動態(tài)查詢實例

Spring Data JPA中的動態(tài)查詢實例

2020-09-05 11:12anxpp Java教程

本篇文章主要介紹了詳解Spring Data JPA中的動態(tài)查詢。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

spring Data JPA大大的簡化了我們持久層的開發(fā),但是實際應(yīng)用中,我們還是需要動態(tài)查詢的。

比如,前端有多個條件,這些條件很多都是可選的,那么后端的SQL,就應(yīng)該是可以定制的,在使用hibernate的時候,可以通過判斷條件來拼接SQL(HQL),當然,Spring Data JPA在簡化我們開發(fā)的同時,也是提供了支持的。

通過實現(xiàn)Criteria二實現(xiàn)的動態(tài)查詢,需要我們的Repo接口繼承JpaSpecificationExecutor接口,這是個泛型接口。

然后查詢的時候,傳入動態(tài)查詢參數(shù),分頁參數(shù)等即可。

使用起來很簡單,不過為了知其所以然,先介紹一下Criteria API。

Criteria API

如果編譯器能夠?qū)Σ樵儓?zhí)行語法正確性檢查,那么對于 Java 對象而言該查詢就是類型安全的。Java™Persistence API (JPA) 的 2.0 版本引入了 Criteria API,這個 API 首次將類型安全查詢引入到 Java 應(yīng)用程序中,并為在運行時動態(tài)地構(gòu)造查詢提供一種機制。本文介紹如何使用 Criteria API 和與之密切相關(guān)的 Metamodel API 編寫動態(tài)的類型安全查詢。

在使用Spring Data JPA的時候,只要我們的Repo層繼承JpaSpecificationExecutor接口就可以使用Specification進行動態(tài)查詢了,我們先看下JpaSpecificationExecutor接口:

?
1
2
3
4
5
6
7
public interface JpaSpecificationExecutor<T> {
 T findOne(Specification<T> spec);
 List<T> findAll(Specification<T> spec);
 Page<T> findAll(Specification<T> spec, Pageable pageable);
 List<T> findAll(Specification<T> spec, Sort sort);
 long count(Specification<T> spec);
}

可以看到提供了5個方法,方法的參數(shù)和返回值已經(jīng)很明顯的表達了其意圖。其中的參數(shù),Pageable和Sort應(yīng)該是比較簡單的,分別是分頁參數(shù)和排序參數(shù),而重點就是Specification參數(shù),先看下這個接口的定義:

?
1
2
3
public interface Specification<T> {
 Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}

其中就一個方法,返回的是動態(tài)查詢的數(shù)據(jù)結(jié)構(gòu)。

?
1
2
3
javax.persistence.criteria.Predicate toPredicate(javax.persistence.criteria.Root<T> root,
javax.persistence.criteria.CriteriaQuery<?> query,
javax.persistence.criteria.CriteriaBuilder cb);

這里使用的都是Java EE中的規(guī)范,具體實現(xiàn)本人采用的是Hibernate,當然也可以選擇其他實現(xiàn)了JPA規(guī)范的數(shù)據(jù)持久層框架。
這里需要再次回過頭看看Criteria API中的一些東西:

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

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

Root接口:代表Criteria查詢的根對象,Criteria查詢的查詢根定義了實體類型,能為將來導(dǎo)航獲得想要的結(jié)果,它與SQL查詢中的FROM子句類似

1:Root實例是類型化的,且定義了查詢的FROM子句中能夠出現(xiàn)的類型。

2:查詢根實例能通過傳入一個實體類型給 AbstractQuery.from方法獲得。

3:Criteria查詢,可以有多個查詢根。

4:AbstractQuery是CriteriaQuery 接口的父類,它提供得到查詢根的方法。CriteriaBuilder接口:用來構(gòu)建CritiaQuery的構(gòu)建器對象Predicate:一個簡單或復(fù)雜的謂詞類型,其實就相當于條件或者是條件組合

其中支持的方法非常之強大,下面給出一個示例,大家可以參考一下,同樣的,可以根據(jù)示例,自己可以寫出更為復(fù)雜的查詢:

Repo接口:

?
1
2
public interface DevHREmpConstrastDao
 extends JpaRepository<DevHREmpConstrast, Long>,JpaSpecificationExecutor<DevHREmpConstrast>

查詢實例1:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 * 條件查詢時動態(tài)組裝條件
 */
private Specification<DevHREmpConstrast> where(
  final String corg,final String name,final String type,final String date,final String checker){
 return new Specification<DevHREmpConstrast>() {
  @Override
  public Predicate toPredicate(Root<DevHREmpConstrast> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
   List<Predicate> predicates = new ArrayList<Predicate>();
   //機構(gòu)
   if(corg!=null&&!corg.equals("")){
    List<String> orgIds = organizationDao.findByName("%"+corg+"%");
    if(orgIds.size()>0&&orgIds.size()<1000)
     predicates.add(root.<String>get("confirmOrgNo").in(orgIds));//confirmOrgNo
   }
   //名字
   if(name!=null&&!name.equals("")){
    List<String> userIds = userDao.findByName(name);
    if(userIds.size()>0&&userIds.size()<1000)//如果太多就不管了這個條件了
     predicates.add(root.<String>get("hrUserName").in(userIds));
   }
   //類型
   if(type!=null&&!type.equals(""))
    predicates.add(cb.equal(root.<String>get("hrUpdateType"),type));
   //日期
   if(date!=null&&!date.equals("")){
    //處理時間
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date startDate;
    Date endDate;
    try {
     startDate = format.parse(date);
    } catch (ParseException e) {
     startDate = new Date(946656000000L);//2000 01 01
    }
    endDate = startDate;
    Calendar calendar = Calendar.getInstance() ;
    calendar.setTime(endDate);
    calendar.add(Calendar.DATE, 1);
    endDate = calendar.getTime();
    calendar = null;
    predicates.add(cb.between(root.<Date>get("insDate"),startDate,endDate));
   }
   //審核人
   if(checker!=null&&!checker.equals("")){
    List<String> userIds = userDao.findByName(checker);
    if(userIds.size()>0&&userIds.size()<1000)//如果太多就不管了這個條件了
     predicates.add(root.<String>get("confirmUserId").in(userIds));
   }
   return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
  }
 };
}

查詢實例2:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 * 條件查詢時動態(tài)組裝條件
 */
 private Specification<DevHREmpConstrast> where(
   final String corg,final String name,final String type,final String date,final String checker){
  return new Specification<DevHREmpConstrast>() {
   @Override
   public Predicate toPredicate(Root<DevHREmpConstrast> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    List<Predicate> predicates = new ArrayList<Predicate>();
    //機構(gòu)
    if(corg!=null&&!corg.equals("")){
     List<String> orgIds = organizationDao.findByName("%"+corg+"%");
     if(orgIds.size()>0&&orgIds.size()<1000)
      predicates.add(root.<String>get("confirmOrgNo").in(orgIds));//confirmOrgNo
    }
    //名字
    if(name!=null&&!name.equals("")){
     List<String> userIds = userDao.findByName(name);
     if(userIds.size()>0&&userIds.size()<1000)//如果太多就不管了這個條件了
      predicates.add(root.<String>get("hrUserName").in(userIds));
    }
    //類型
    if(type!=null&&!type.equals(""))
     predicates.add(cb.equal(root.<String>get("hrUpdateType"),type));
    //日期
    if(date!=null&&!date.equals("")){
     //處理時間
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
     Date startDate;
     Date endDate;
     try {
      startDate = format.parse(date);
     } catch (ParseException e) {
      startDate = new Date(946656000000L);//2000 01 01
     }
     endDate = startDate;
     Calendar calendar = Calendar.getInstance() ;
     calendar.setTime(endDate);
     calendar.add(Calendar.DATE, 1);
     endDate = calendar.getTime();
     calendar = null;
     predicates.add(cb.between(root.<Date>get("insDate"),startDate,endDate));
    }
    //審核人
    if(checker!=null&&!checker.equals("")){
     List<String> userIds = userDao.findByName(checker);
     if(userIds.size()>0&&userIds.size()<1000)//如果太多就不管了這個條件了
      predicates.add(root.<String>get("confirmUserId").in(userIds));
    }
    return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
   }
  };
 }

然后調(diào)用dao層方法傳入where()方法返回的參數(shù)即可。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/anxpp/article/details/51996472

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月婷婷激情 | 精品国产一区探花在线观看 | a级片在线观看 | 亚洲激情视频 | 欧美午夜一区 | 国产中文视频 | 操操操干干 | 国产日韩欧美高清 | 日韩视频一区 | 亚洲国产精品激情在线观看 | 亚洲色图网站 | 精品久久久久一区二区国产 | 国产成人精品午夜视频' | 97久久超碰 | 亚洲视频精品一区 | 欧美在线免费观看 | 国内精品视频 | 亚洲91av | 中文字幕精品视频 | 在线观看日韩 | 国产色在线| 欧美1区2区3区 | 丁香综合 | 国产精品九九九 | 91久久精品 | 亚洲精品视频在线 | 在线播放一级片 | 老牛嫩草一区二区三区眼镜 | 中文字幕乱码亚洲无线三区 | 欧美日本韩国一区二区三区 | 国产美女网站 | 欧美视频在线播放 | 亚洲精品一区二区三区在线 | 色网站视频 | 午夜精品久久久久久久星辰影院 | 黄色影片免费观看 | 波多野结衣一区二区三区中文字幕 | 午夜精品在线 | 精品成人免费一区二区在线播放 | 亚洲三级在线观看 | 久久高清片 |