生活随笔
收集整理的這篇文章主要介紹了
QueryDSL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.問題的提出
有的人可能會遇到這樣的代碼,看了后難以忍受,缺點如下所述:
返回類型Object[]數組,至于每一個下標對應哪個字段,沒法直觀的看到,例如object[11]是什么類型? 字段名是什么? 這個就無法直觀得知 .sql中復雜的關系導致不可維護,每一個接手的人都要研究sql半天該種動態拼接條件方法導致類似的代碼會大量重復,所以IDEA打開的時候黃了半邊天.該查詢為分頁查詢,這樣寫的話,還要再copy一個count查詢才能拿到總數,無疑又是代碼重復.JPA之類框架目的就是少些原生sql語句,大量這樣的操作的話,還不如使用dbUtil這樣的工具類查詢. 1 @Override
2 public List<Object[]>
findByPcardCardOrder(
3 PcardCardOrder pcardCardOrder,String applyInstName2,Integer page, Integer rows) {
4 StringBuffer sql =
new StringBuffer(
5 "SELECT p.*"
6 +",p2.vcard_make_des"
7 +",p3.cardnum_rule_id,p3.vtype_nm"
8 +",p4.cn_card_bin,p4.cn_nm"
9 +",p5.inst_id,p5.inst_name,p5.apply_range,p5.card_name,p5.card_type,p5.bin_card_material"
10 +",p6.inst_name AS apply_inst_name "
11 +",p7.inst_name AS apply_inst_name2"
12 + ",p8.inst_name as receive_inst_name"
13 + " FROM "
14 +" tbl_pcard_card_order p LEFT JOIN tbl_pcard_vcard_make p2 ON p.make_id = p2.vcard_make_id"
15 +" LEFT JOIN tbl_pcard_vtype p3 ON p2.vcard_make_vtype_id=p3.vtype_id"
16 +" LEFT JOIN tbl_pcard_cardnum_rule p4 ON p3.cardnum_rule_id=p4.cn_id"
17 +" LEFT JOIN tbl_pcard_cardbin p5 ON p4.cn_card_bin=p5.card_bin"
18 +" LEFT JOIN tbl_pcard_institution p6 ON p5.apply_range=p6.inst_id"
19 +" LEFT JOIN tbl_pcard_institution p7 ON p.apply_inst_id=p7.inst_id"
20 +" LEFT JOIN tbl_pcard_institution p8 ON p.receive_inst=p8.inst_id"
21 +" WHERE 1=1 "
);
22 int i = 1
;
23 Map<String, Object> map =
new HashMap<String, Object>
();
24
25 if (!
StringUtils.isEmpty(pcardCardOrder.getCordId())) {
26 sql.append(" and p.cord_id="
);
27 sql.append("?" +
i);
28 map.put(i + ""
, pcardCardOrder.getCordId());
29 i++
;
30 }
31 if (!
StringUtils.isEmpty(pcardCardOrder.getAppointMchtcard())) {
32 sql.append(" and p.appoint_mchtcard="
);
33 sql.append("?" +
i);
34 map.put(i + ""
, pcardCardOrder.getAppointMchtcard());
35 i++
;
36 }
37
38 if (!
StringUtils.isEmpty(pcardCardOrder.getMakeId())) {
39 sql.append(" and p.make_id like "
);
40 sql.append("?" +
i);
41 map.put(i + "","%%"+ pcardCardOrder.getMakeId()+"%%"
);
42 i++
;
43 }
44
45 if (!
StringUtils.isEmpty(applyInstName2)) {
46 sql.append(" and p7.inst_name like "
);
47 sql.append("?"+
i);
48 map.put(i+"","%%"+applyInstName2+"%%"
);
49 i++
;
50 }
51
52 sql.append(" order by p.ct_dm desc"
);
53 Query query =
entityManager.createNativeQuery(sql.toString());
54 for (String key : map.keySet()) {
55 query.setParameter(key, map.get(key));
56 }
57 if (page !=
null && rows !=
null) {
58 query.setFirstResult(rows * (page - 1
));
59 query.setMaxResults(rows);
60 }
61 return query.getResultList();
62 }
Problem Code ?
2.學習QueryDSL
而QueryDSL就可以避免上面全部的問題,在解決問題之前先學習如何使用 .
2.1 QueryDSL簡介
QueryDSL僅僅是一個通用的查詢框架,專注于通過Java API構建類型安全的SQL查詢。QueryDSL可以通過一組通用的查詢API為用戶構建出適合不同類型ORM框架或者是SQL的查詢語句,也就是說QueryDSL是基于各種ORM框架以及SQL之上的一個通用的查詢框架。借助QueryDSL可以在任何支持的ORM框架或者SQL平臺上以一種通用的API方式來構建查詢。目前QueryDSL支持的平臺包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。官網地址:點擊進入 2.2配置到項目
首先對于queryDSL有兩個版本,com.mysema.querydsl和com.querydsl,前者是3.X系列,后者是4.X系列,這里使用的是后者.
第一步: Maven引入依賴
第二步: 加入插件,用于生成查詢實例
執行mvn compile之后,可以找到該target/generated-sources/java,然后IDEA標示為源代碼目錄即可.
借鑒鏈接:https://www.jianshu.com/p/2b68af9aa0f5
共同學習,共同進步,若有補充,歡迎指出,謝謝!
轉載于:https://www.cnblogs.com/dengguangxue/p/10496273.html
總結
以上是生活随笔為你收集整理的QueryDSL的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。