SpringDataJPA学习记录(四)--使用QueryDSL
发布时间:2023-03-27 14:19:44 所属栏目:教程 来源:
导读:最近再看公司项目中有如下代码,看了后简直不能忍.缺点列出来的话,如下:
返回类型Object[]数组,至于每一个下标对应哪个字段,没法直观的看到,例如object[11]是什么类型?字段名是什么?这个就无法直观得知.
sql中复杂
返回类型Object[]数组,至于每一个下标对应哪个字段,没法直观的看到,例如object[11]是什么类型?字段名是什么?这个就无法直观得知.
sql中复杂
最近再看公司项目中有如下代码,看了后简直不能忍.缺点列出来的话,如下: 返回类型Object[]数组,至于每一个下标对应哪个字段,没法直观的看到,例如object[11]是什么类型?字段名是什么?这个就无法直观得知. sql中复杂的关系导致不可维护,每一个接手的人都要研究sql半天 该种动态拼接条件方法导致类似的代码会大量重复,所以IDEA打开的时候黄了半边天. 该查询为分页查询,这样写的话,还要再copy一个count查询才能拿到总数,无疑又是代码重复. JPA这种框架目的就是少些原生sql语句,大量这样的操作的话,还不如使用dbUtil这样的工具类查询. @Override public List<Object[]> 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<String,Object> map = new HashMap<String,Object>(); 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就可以避免上面全部的问题,在解决问题之前先学习如何使用. 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引入依赖: <!--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标示为源代码目录即可. (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐