JavaShuo
欄目
標籤
JPQ整合Querydsl入門篇
時間 2020-01-06
標籤
jpq
整合
querydsl
入門
简体版
原文
原文鏈接
# JPQ整合Querydsl入門篇 不知道大家喜不喜歡用JPA ,我本人是很喜歡 不要和我說JPA不適合複雜查詢等等的,你要知道如今都是微服務,只要你服務器拆分夠細表設計夠合理,都是服務之間調能用到多少關聯查詢呢? 並且結合了QueryDsl工具讓你寫起來更快,本博客後臺就是使用了JPA+QueryDsl 作的查詢 下面開始講解吧。 ### 1.爲何要用QueryDsl 先來看個代碼 @Override public List
findByPcardCardOrder( PcardCardOrder pcardCardOrder,String applyInstName2,Integer page, Integer rows) { StringBuffer sql = new StringBuffer( "SELECT p.*" +",p2.vcard_make_des" +",p3.cardnum_rule_id,p3.vtype_nm" +",p4.cn_card_bin,p4.cn_nm" +",p5.inst_id,p5.inst_name,p5.apply_range,p5.card_name,p5.card_type,p5.bin_card_material" +",p6.inst_name AS apply_inst_name " +",p7.inst_name AS apply_inst_name2" + ",p8.inst_name as receive_inst_name" + " FROM " +" tbl_pcard_card_order p LEFT JOIN tbl_pcard_vcard_make p2 ON p.make_id = p2.vcard_make_id" +" LEFT JOIN tbl_pcard_vtype p3 ON p2.vcard_make_vtype_id=p3.vtype_id" +" LEFT JOIN tbl_pcard_cardnum_rule p4 ON p3.cardnum_rule_id=p4.cn_id" +" LEFT JOIN tbl_pcard_cardbin p5 ON p4.cn_card_bin=p5.card_bin" +" LEFT JOIN tbl_pcard_institution p6 ON p5.apply_range=p6.inst_id" +" LEFT JOIN tbl_pcard_institution p7 ON p.apply_inst_id=p7.inst_id" +" LEFT JOIN tbl_pcard_institution p8 ON p.receive_inst=p8.inst_id" +" WHERE 1=1 "); int i = 1; Map
map = new HashMap
(); if (!StringUtils.isEmpty(pcardCardOrder.getCordId())) { sql.append(" and p.cord_id="); sql.append("?" + i); map.put(i + "", pcardCardOrder.getCordId()); i++; } if (!StringUtils.isEmpty(pcardCardOrder.getAppointMchtcard())) { sql.append(" and p.appoint_mchtcard="); sql.append("?" + i); map.put(i + "", pcardCardOrder.getAppointMchtcard()); i++; } if (!StringUtils.isEmpty(pcardCardOrder.getMakeId())) { sql.append(" and p.make_id like "); sql.append("?" + i); map.put(i + "","%%"+ pcardCardOrder.getMakeId()+"%%"); i++; } if (!StringUtils.isEmpty(applyInstName2)) { sql.append(" and p7.inst_name like "); sql.append("?"+i); map.put(i+"","%%"+applyInstName2+"%%"); i++; } sql.append(" order by p.ct_dm desc"); Query query = entityManager.createNativeQuery(sql.toString()); for (String key : map.keySet()) { query.setParameter(key, map.get(key)); } if (page != null && rows != null) { query.setFirstResult(rows * (page - 1)); query.setMaxResults(rows); } return query.getResultList(); } 多的不用說了吧,我看到這種代碼就想吐 也沒心情看,說真的這個還算好的了,還見過更多更噁心的 ### 2.瞭解QueryDsl [QueryDsl官網文檔](http://www.querydsl.com/static/querydsl/4.1.3/reference/html_single/) QueryDSL僅僅是一個通用的查詢框架,專一於經過Java API構建類型安全的SQL查詢。 Querydsl能夠經過一組通用的查詢API爲用戶構建出適合不一樣類型ORM框架或者是SQL的查詢語句,也就是說QueryDSL是基於各類ORM框架以及SQL之上的一個通用的查詢框架。 藉助QueryDSL能夠在任何支持的ORM框架或者SQL平臺上以一種通用的API方式來構建查詢。目前QueryDSL支持的平臺包括JPA,JDO,SQL,Mongodb 等等。。。 ### 3.引入QueryDsl #### 3.1 pom中引入依賴
com.querydsl
querydsl-jpa
com.querydsl
querydsl-apt
provided
#### 3.2 添加maven插件 添加這個插件是爲了讓程序自動生成query type(查詢實體,命名方式爲:"Q"+對應實體名)。 注:在使用過程當中,若是遇到query type沒法自動生成的狀況,用maven更新一下項目便可解決(右鍵項目->Maven->Update Project), 或者之間終端輸入 mvn clean compile 編譯一下就會自動生成Q 類
com.mysema.maven
apt-maven-plugin
1.1.3
process
target/generated-sources/java
com.querydsl.apt.jpa.JPAAnnotationProcessor
#### 3.3 JPA的基本配置,在application.yml中配置 spring: jpa: database: mysql show-sql: true open-in-view: true hibernate: ddl-auto: update naming: strategy: org.hibernate.cfg.DefaultComponentSafeNamingStrategy properties: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect format_sql: true #### 3.4 建立實體 這裏只是列出了部分屬性 @Data @Entity @EntityListeners(AuditingEntityListener.class) public class BlogInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 博客標題 */ private String blogTitle; /** * 博客內容 */ @Column(columnDefinition = "text") private String blogContent; /** * 博客簡要 */ private String blogShortContent; } #### 3.5 引入JPAQueryFactory @Service public class BlogInfoServiceImpl implements BlogInfoService { private JPAQueryFactory queryFactory; @PostConstruct //指定初始化queryFactory public void init() { queryFactory = new JPAQueryFactory(entityManager); } @PersistenceContext private EntityManager entityManager; } ### 4.使用QueryDsl 先定義一個Q類 ,Q類是QueryDsl幫咱們編譯的時候生成的對應的是實體類 QBlogInfo qBlogInfo = QBlogInfo.blogInfo; ### 5. 查詢全部屬性 經過queryFactory查詢 queryFactory.select(qBlogInfo) .from(qBlogInfo) 表示查詢BlogInfo全部的屬性 至關於select * from blog_Info ### 6.查詢特定屬性 queryFactory.select(qBlogInfo.blogTitle,qBlogInfo.blogContent) .from(qBlogInfo) 表示查詢BlogInfo實體的 blogTitle 屬性 至關於 select blogTitle,blogContent from blog_Info ### 7.帶where查詢 queryFactory.select(qBlogInfo) .from(qBlogInfo) .where(qBlogInfo.id.eq(1)) 至關於 select blogTitle from blog_Info where id = 1; ### 8.多表查詢 多表返回Tuple ,tuple.get(0) 就是第一個屬性qBlogInfo , tuple.get(1) 就是獲取第二個屬性 typeName queryFactory.select(qBlogInfo, qBlogType.typeName) .from(qBlogInfo) .leftJoin(qBlogType) .on(qBlogInfo.blogTypeId.eq(qBlogType.id)) ### 9.排序查詢 追加orderBy方法指定按照什麼屬性進行排序 queryFactory.select(qBlogInfo) .from(qBlogInfo) .orderBy(qBlogInfo.createTime.desc()) ### 10.分頁查詢 追加offset 偏移位置,就是從哪條數據開始查詢 最佳limit 限制查詢多少條 JPAQuery jpaQuery = queryFactory.select(qBlogInfo, qBlogType.typeName) .from(qBlogInfo) .leftJoin(qBlogType) .on(qBlogInfo.blogTypeId.eq(qBlogType.id)) .orderBy(qBlogInfo.createTime.desc()) .offset(pageable.getPageNumber() * pageable.getPageSize()) .limit(pageable.getPageSize()); ### 11.執行查詢 經過上面構造的 jpaQuery jpaQuery.fetchResults(); 查詢list ,返回 list 泛型根據是否有多表查詢, 若是沒有就返回 好比上面的QBlogInfo 對應的 BlogInfo ==》 list
, 若是有多表查詢 返回 list
類型,再根據tuple.get(0) tuple.get(1) 去獲取對應的屬性 jpqQuery.fetchOne(); 查詢單條記錄 好比where id = xxx 的時候可使用 ### 12.樣例 根據ID查詢博客 /** * 根據 Id 查詢博客信息 * * @param id : id * @return : 博客信息 */ @Override public BlogInfoVo queryById(Long id) { QBlogInfo qBlogInfo = QBlogInfo.blogInfo; QBlogType qBlogType = QBlogType.blogType; Tuple tuple = queryFactory.select(qBlogInfo, qBlogType.typeName) .from(qBlogInfo) .leftJoin(qBlogType) .on(qBlogInfo.blogTypeId.eq(qBlogType.id)) .where(qBlogInfo.id.eq(id)) .fetchOne(); BlogInfo blogInfo = tuple.get(0, BlogInfo.class); Gson gson = new Gson(); List
list = gson.fromJson(blogInfo.getAnchorJson(), List.class); BlogInfoVo blogInfoVo = BlogInfoConverter.INSTANCE.domain2vo(tuple.get(0, BlogInfo.class)).setBlogTypeName(tuple.get(1, String.class)); blogInfoVo.setAnchors(list); return blogInfoVo; } ### 總結: 本篇簡單介紹了在JPA中如何使用QueryDsl,包括pom依賴 插件, queryFactory的初始化,以及 各類例子包括 分頁 排序 等等查詢 看着使用QueryDsl寫出來的sql查詢 是否是很舒服呢! 後續會深刻講解一下 QueryDsl的高級點的用法 > 我的博客地址: https://www.askajohnny.com 歡迎訪問! > 本文由博客一文多發平臺 [OpenWrite](https://openwrite.cn?from=article_bottom) 發佈!
相關文章
1.
JPQ整合Querydsl入門篇
2.
Querydsl-JPA學習(入門篇)
3.
Spring JPA整合QueryDSL
4.
redis入門——Spring整合篇
5.
SpringBoot整合SpringMVC+MyBatis——入門篇
6.
Querydsl-JPA學習(進階篇)
7.
JavaScript入門篇整理(一)
8.
JavaScript入門篇整理(二)
9.
Spring Boot整合RabbitMQ入門
10.
struts2 整合tiles 入門
更多相關文章...
•
Memcached入門教程
-
NoSQL教程
•
Neo4j數據庫入門教程
-
NoSQL教程
•
YAML 入門教程
•
Java Agent入門實戰(一)-Instrumentation介紹與使用
相關標籤/搜索
querydsl
jpq
JavaScript入門篇
入門篇
入門篇3
opencv入門篇
Python入門篇
C入門篇
springboot 入門篇
Spring入門篇
PHP 7 新特性
Spring教程
PHP教程
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
說說Python中的垃圾回收機制?
2.
螞蟻金服面試分享,阿里的offer真的不難,3位朋友全部offer
3.
Spring Boot (三十一)——自定義歡迎頁及favicon
4.
Spring Boot核心架構
5.
IDEA創建maven web工程
6.
在IDEA中利用maven創建java項目和web項目
7.
myeclipse新導入項目基本配置
8.
zkdash的安裝和配置
9.
什麼情況下會導致Python內存溢出?要如何處理?
10.
CentoOS7下vim輸入中文
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
JPQ整合Querydsl入門篇
2.
Querydsl-JPA學習(入門篇)
3.
Spring JPA整合QueryDSL
4.
redis入門——Spring整合篇
5.
SpringBoot整合SpringMVC+MyBatis——入門篇
6.
Querydsl-JPA學習(進階篇)
7.
JavaScript入門篇整理(一)
8.
JavaScript入門篇整理(二)
9.
Spring Boot整合RabbitMQ入門
10.
struts2 整合tiles 入門
>>更多相關文章<<