成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JPA的好搭檔 - QueryDSL

數據庫 其他數據庫
QueryDSL 的簡單應用,用寫SQL的方法來寫代碼,是不是很舒服呢!文中的例子僅僅淺嘗輒止,希望大家可以實際應用一下,后續我也會更深入的講解一些 QueryDSL 的高級用法。

?0. 前言

相對于 MyBatis ,本人更喜歡 Spring Data JPA ,因為它更符合面向對象的思想,然而 JPA 對復雜的查詢支持較弱,常見的有兩種方式:

一種方式是Repository繼承JpaSpecificationExecutor接口,優點是支持復雜查詢、編譯期可以規避一些語法錯誤,缺點是語法晦澀難懂,學習成本太高。

還有一種方式就是直接寫 SQL ,可以通過JdbcTemplate或者@Query注解的方式查詢,優點是簡單,缺點嘛...先看段代碼:

@Query(value="select bs.* from " +
"(select t.baseid,t.basesn,t.basecreatorfullname,t.basestatus,t.basesummary,'北京' faultprovince, '北京' faultcity, " +
"replace(t.INC_ResponseLevel,'響應','') inc_responselevel,t.inc_happentime,t.basecreatedate,t.inc_equipmentmanufacturer, " +
"t.inc_ne_name,t.inc_alarm_id,t.site_alerttype,t.alarmlevel,t.inc_alarm_desc,t.baseacceptouttime,t.basedealouttime, " +
"decode(t.flagPretreatment,null,'否','未預處理','否','是') flagpretreatment,decode(t.flagPretreatment,null,'否','未預處理','否','是') flagpretreatment2, " +
"decode(nvl(t.isImportantIncident, 0),1,'是','否') isimportantincident, decode(nvl(t.INC_IsEffectOP, 0),1,'是','否') inc_iseffectop, " +
"t.operationdeal, t.t0_deal,t.faultdescription,t.dealguomodo,t.inc_alarm_cleartime,t.clearinctime, " +
"t.renewtime,t.baseclosedate,nvl2(t.checkdealresult,'是','否') checkdealresult,g.jtitem1,g.jtitem2,g.jtitem3,t.reasontype " +
"from T_DEMO t, T_DEMO_MAP g " +
"where t.Sheet_type = '傳輸網絡故障處理工單' and t.basestatus = '已歸檔' " +
"and t.baseCloseDate >= :beginTime and t.baseCloseDate < :endTime " +
"and (t.Withdraw_Desc = g.withdraw_desc or t.alarmname = g.alarmname) " +
"union all " +
"select t.baseid,t.basesn,t.basecreatorfullname,t.basestatus,t.basesummary,'北京' faultprovince, '北京' faultcity, " +
"replace(t.INC_ResponseLevel,'響應','') inc_responselevel,t.inc_happentime,t.basecreatedate,t.inc_equipmentmanufacturer, " +
"t.inc_ne_name,t.inc_alarm_id,t.site_alerttype,t.alarmlevel,t.inc_alarm_desc,t.baseacceptouttime,t.basedealouttime, " +
"decode(t.flagPretreatment,null,'否','未預處理','否','是') flagpretreatment,decode(t.flagPretreatment,null,'否','未預處理','否','是') flagpretreatment2, " +
"decode(nvl(t.isImportantIncident, 0),1,'是','否') isimportantincident, decode(nvl(t.INC_IsEffectOP, 0),1,'是','否') inc_iseffectop, " +
"t.operationdeal,t.t0_deal,t.faultdescription,t.dealguomodo,t.inc_alarm_cleartime,t.clearinctime, " +
"t.renewtime,t.baseclosedate,nvl2(t.checkdealresult,'是','否') checkdealresult,w.jtitem1,w.jtitem2,w.jtitem3,t.reasontype " +
"from WF_BMCC_EOMS_ITDealFault t, (select distinct c.value,c.jtitem1,c.jtitem2,c.jtitem3 from WF_Config_EL_00_NetType c) w " +
"where (t.Sheet_type = 'test0' or t.Sheet_type = 'test1' or t.Sheet_type = 'test2' " +
"or t.Sheet_type = 'test3' or t.Sheet_type = 'test4') and t.basestatus = '已歸檔' " +
"and t.baseCloseDate >= :beginTime and t.baseCloseDate < :endTime " +
"and t.faultclass = w.value "+
" ) bs " +
"where not exists (select dp.processbaseid from T_DEAL dp,T_GROUPS dg where dp.ProcessBaseSchema = " +
"'DEALFAULT' and dp.processbaseid = bs.baseid and dp.groupid = dg.groupid) ",
nativeQuery=true)
List<DemoEntity> findOne(@Param("beginTime") long beginTime, @Param("endTime") long endTime);

看著想吐,就是直接寫SQL的缺點。

下面隆重介紹 JPA 的最佳搭檔:QueryDSL。它的語法跟SQL一樣簡單,且代碼清晰,具有代碼提示、編譯期錯誤檢查等優勢。同時,在架構的層次上實現了讀寫分離:JPA負責增刪改、QueryDSL負責查詢。

1. QueryDsl介紹

QueryDSL 是一個通用的查詢框架,專注于通過 Java API 構建類型安全的SQL查詢。

QueryDSL 可以通過一組通用的查詢 API 為用戶構建出適合不同類型ORM框架或者是 SQL 的查詢語句,也就是說 QueryDSL 是基于各種 ORM 框架以及 SQL 之上的一個通用的查詢框架。

借助 QueryDSL 可以在任何支持的 ORM 框架或者 SQL 平臺上以一種通用的API方式來構建查詢。目前 QueryDSL 支持的平臺包括 JPA、JDO、SQL、Mongodb 等等。

2. 引入QueryDSL

本文以gradle構建為例,前提是已引入 Spring Data Jpa ,且JPA可正常使用。

implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'

引入JPAQueryFactory

@Service
public class DemoQueryDSL {
@Autowired
private JPAQueryFactory queryFactory;
}

3. 創建JPA Entity

我們分別創建兩個示例實體類:職員表、部門表。

/**
* 職員表
*/
@Data
@Entity
@Table(name = "T_EMP")
public class Emp {
@Id
private String id;//ID
@Column
private String name;//姓名
@Column
private Integer age;//年齡
@Column
private String sex;//性別
@Column
private String depId;//部門ID
}

/**
* 部門表
*/
@Data
@Entity
@Table(name = "T_DEP")
public class Dep {
@Id
private String id;//ID
@Column
private String depName;//部門名稱
}

編譯后,QueryDSL 會幫助我們會自動生成兩個Q類:QEmp、QDep ,我們之后進行的所有查詢都是圍繞這些Q類來進行的。

4. 簡單查詢

QueryDSL提供了一種類似于SQL的面向對象寫法,并且是類型安全的,搭配上IDEA的語句提示功能,寫起SQL來非常舒服。

請欣賞下面的例子:

public void simpleSql(){
QEmp emp = QEmp.emp;//員工表
/**
* 簡單條件查詢、排序,相當于sql:
* select * from T_EMP
* where name like '張%' and age > 25
* order by age desc;
*/
List<Emp> empList = queryFactory.select(emp)
.where(emp.name.startsWith("張").and(emp.age.gt(25)))
.orderBy(emp.age.desc())
.fetch();

/**
* 分組查詢,相當于sql:
* select e.dep_id, max(e.age) from T_EMP e
* grouping by e.depId;
*/
List<Tuple> list = queryFactory.select(emp.depId, emp.age.max())
.groupBy(emp.depId)
.fetch();

/**
* 分頁查詢,相當于sql:
* select * from T_EMP e
* where e.dep_id='123'
* limit 20 10;
*/
List<Emp> pageList = queryFactory.select(emp)
.where(emp.depId.eq("123"))
.offset(20)
.limit(10)
.fetch();
}

5. 復雜查詢

QueryDSL對于復雜查詢的支持也是相當優秀的,比如多表關聯、動態條件查詢等。

public void complexSql(){
QEmp emp = QEmp.emp;//員工表
QDep dep = QDep.dep;//部門表

/**
* 關聯查詢,相當于sql:
* select e.* from T_EMP e
* left join T_DEP d on e.dep_id = d.id
* where d.dep_name = '財務部'
*/
List<Emp> empList = queryFactory.select(emp)
.from(emp)
.leftJoin(dep).on(emp.depId.eq(dep.id))
.where(dep.depName.eq("財務部"))
.fetch();

/**
* 嵌套查詢,相當于sql:
* select e.* from T_EMP e
* where e.dep_id = (
* select id form T_DEP where dep_name = '財務部'
* )
*/
List<Emp> empList1 = queryFactory.select(emp)
.from(emp)
.where(emp.depId.eq(
queryFactory.select(dep.id).from(dep)
.where(dep.depName.eq("財務部"))
))
.fetch();

/**
* 動態條件、別名、獲取不同結果:

*/
BooleanBuilder condition = new BooleanBuilder();
condition.and(emp.age.goe(25));
if (true) {//動態條件
condition.and(emp.sex.eq("男"));
}
queryFactory.select(emp.name.as("fullname"))
.where(condition)
.fetch();//查找多個結果,返回集合
//.fetchOne();//查詢只返回一個結果,如果返回多個則拋異常
//.fetchFirst();//返回多個結果時,只取第一個
}

小結

以上就是 QueryDSL 的簡單應用,用寫SQL的方法來寫代碼,是不是很舒服呢!文中的例子僅僅淺嘗輒止,希望大家可以實際應用一下,后續我也會更深入的講解一些 QueryDSL 的高級用法。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2022-05-26 07:42:22

Python編輯器VSCode

2023-02-24 13:07:07

2022-11-14 09:55:34

長江存儲

2011-05-20 07:40:08

2021-05-29 20:45:37

辦公

2017-11-09 16:02:26

11.11

2021-03-24 16:59:15

存儲

2019-09-18 13:32:00

DELL筆記本

2023-07-17 11:25:35

.NET程序WinDbgPerfview

2019-12-11 10:00:10

區塊鏈區塊鏈技術

2011-06-22 10:13:58

TRILLFCoESTP

2020-06-02 10:00:33

GitHub 技術開發

2009-07-03 10:48:12

JSP和JSF

2019-12-23 13:52:51

區塊鏈物聯網IOT

2019-11-07 13:22:15

戴爾

2022-10-10 16:14:28

元宇宙互聯網虛擬世界

2012-03-16 16:43:59

華碩無線路由器

2009-12-08 12:32:09

GoogleChrome瀏覽器

2012-03-06 11:25:40

ibmdw
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美激情精品一区 | www日韩高清 | 草比av| 91久久久久 | 91精品一区二区三区久久久久久 | 国产精品久久久久久久久久免费看 | 久久在线| 日本中文字幕在线观看 | 久久99国产精品久久99果冻传媒 | 国产精品久久久久久久久久久久 | 国产精品成人一区二区 | 国产视频2021| 久久久久久国产精品免费免费 | 中文字幕 在线观看 | 欧美日韩国产精品一区 | 亚洲精品电影网在线观看 | 久久国产传媒 | 成人av免费在线观看 | 中文在线视频观看 | 午夜精品一区二区三区在线视 | 精品一区二区三区中文字幕 | 精品国产精品三级精品av网址 | 国产亚洲精品精品国产亚洲综合 | 日韩精品一区二区三区在线播放 | 久久精品视频网站 | 亚洲精品久久久久久久久久久 | 欧美中文字幕一区 | 国产精品久久久久久久久久了 | 欧美群妇大交群中文字幕 | 亚州精品天堂中文字幕 | 国产精品99久久久久久www | 成人二区| 国产精品久久久久久中文字 | 午夜精品网站 | 黄色大片视频 | 成人免费日韩 | 久久久久久国产精品免费免费狐狸 | 国产精品成av人在线视午夜片 | 国产精品美女久久久久aⅴ国产馆 | 在线电影日韩 | av网站免费观看 |