QueryDSL


1.問題的提出

  有的人可能會遇到這樣的代碼,看了后難以忍受,缺點如下所述:

    1. 返回類型Object[]數組,至於每一個下標對應哪個字段,沒法直觀的看到,例如object[11]是什么類型? 字段名是什么? 這個就無法直觀得知 .
    2. sql中復雜的關系導致不可維護,每一個接手的人都要研究sql半天
    3. 該種動態拼接條件方法導致類似的代碼會大量重復,所以IDEA打開的時候黃了半邊天.
    4. 該查詢為分頁查詢,這樣寫的話,還要再copy一個count查詢才能拿到總數,無疑又是代碼重復.
    5. 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簡介

    1. QueryDSL僅僅是一個通用的查詢框架,專注於通過Java API構建類型安全的SQL查詢。
    2. QueryDSL可以通過一組通用的查詢API為用戶構建出適合不同類型ORM框架或者是SQL的查詢語句,也就是說QueryDSL是基於各種ORM框架以及SQL之上的一個通用的查詢框架。
    3. 借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一種通用的API方式來構建查詢。目前QueryDSL支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。
    4. 官網地址:點擊進入

  2.2配置到項目

    首先對於queryDSL有兩個版本,com.mysema.querydslcom.querydsl,前者是3.X系列,后者是4.X系列,這里使用的是后者.

    第一步: Maven引入依賴

    <!--query dsl--> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> <!--query dsl end-->

    第二步: 加入插件,用於生成查詢實例

<!--該插件可以生成querysdl需要的查詢對象,執行mvn compile即可--> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>

    執行mvn compile之后,可以找到該target/generated-sources/java,然后IDEA標示為源代碼目錄即可.

     


借鑒鏈接:https://www.jianshu.com/p/2b68af9aa0f5

共同學習,共同進步,若有補充,歡迎指出,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM