Springboot使用queryDSL

一、简介

Querydsl 是一个类型安全的 Java 查询框架,支持 JPA, JDO, JDBC, Lucene, Hibernate Search 等标准。类型安全(Type safety)和一致性(Consistency)是它设计的两大准则。在 Spring Boot 中可以很好的弥补 JPA 的不灵活,实现更强大的逻辑。

JPA操作多表操作的时候,很麻烦,我们也可以建关联关系,但是需要维护一对关系,序列化的问题,JPA的单表操作也很麻烦,不然就得写SQL语句,一点都不灵活。非常怀念MyBatis-plus,所幸找到了QueryDSL这个Java框架,大大的简化了JPA查询的复杂度。

下面就是一个操作JPA单表复杂查询

/*** 组装条件查询** @param companyReq* @return*/
private Specification selectCompanyCondition(CompanyReq companyReq) {return new Specification() {@Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {List<Predicate> predicates = Lists.newArrayList();// 英文简称if (!StringUtils.isEmpty(companyReq.getCompanyCode())) {predicates.add(criteriaBuilder.equal(root.get("companyCode"), companyReq.getCompanyCode()));}// 企业域名if (!StringUtils.isEmpty(companyReq.getCompanyDNS())) {predicates.add(criteriaBuilder.equal(root.get("companyDNS"), companyReq.getCompanyDNS()));}// 英文全称if (!StringUtils.isEmpty(companyReq.getCompanyFullCode())) {predicates.add(criteriaBuilder.equal(root.get("companyFullCode"), companyReq.getCompanyFullCode()));}// 企业简称if (!StringUtils.isEmpty(companyReq.getCompanyName())) {predicates.add(criteriaBuilder.like(root.get("companyName"), "%" + companyReq.getCompanyName() + "%"));}// 注册时间 时间段之内if ((companyReq.getCreateEndTime() != null) && (companyReq.getCreateStartTime() != null)) {predicates.add(criteriaBuilder.between(root.get("createTime"), companyReq.getCreateStartTime(), companyReq.getCreateEndTime()));}// 按照创建时间排序 默认为 不传该字段 或者 rankType = true  为  降序if (companyReq.getRankType() == null || companyReq.getRankType()) {query.orderBy(criteriaBuilder.desc(root.get("createTime")));} else {query.orderBy(criteriaBuilder.asc(root.get("createTime")));}return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));}};
}

并且在不是很想加关联关系,但是想做关联查询。就很无奈了,我并没有找到好的方法区处理。QueryDSL就可以很好地处理。下面开始介绍!

二、添加依赖

<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><scope>provided</scope>
</dependency>
<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId>
</dependency>

三、添加maven插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!--  插件失败:将{JAVA_HOME}/lib/tools.jar 复制到 jre/lib 目录下  --><!--  插件如果还是飘红,无所谓,无视就可以  --><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><phase>generate-sources</phase><goals><goal>process</goal></goals><configuration><!--  将生成对应的实例类的操作类  --><outputDirectory>target/generated-sources</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions></plugin></plugins>
</build>

四、添加QueryDSL的配置类

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.persistence.EntityManager;/*** @author 墨龙吟* @version 1.0.0* @ClassName QueryDSLConfig.java* @Email 2354713722@qq.com* @Description TODO* @createTime 2019年08月27日 - 19:52*/
@Configuration
public class QueryDSLConfig {@Autowiredprivate EntityManager entityManager;@Beanpublic JPAQueryFactory getQueryFactory() {return new JPAQueryFactory(entityManager);}}

五、实例使用

在操作Service类中注入JPAQueryFactory

@Autowired
private JPAQueryFactory queryFactory;

然后就可以操作了数据表了。

where和orderBy使用:

@Override
public List<FileEntity> getAll() {QFileEntity qFileEntity = QFileEntity.fileEntity;return queryFactory.selectFrom(qFileEntity).where(qFileEntity.canView.eq(true)).orderBy(qFileEntity.createTime.desc()).fetch();
}

多表联查,返回指定的字段

@Override
public List<FileVO> getFileList() {QFileEntity qFileEntity = QFileEntity.fileEntity;QUserEntity qUserEntity = QUserEntity.userEntity;List<FileVO> result = queryFactory.select(Projections.bean(FileVO.class,qFileEntity.fileUrl,qFileEntity.fileName,qFileEntity.fileId,qFileEntity.updateTime,qFileEntity.createTime,qFileEntity.userId,qFileEntity.brief,qUserEntity.userName,qFileEntity.isDefault)).from(qFileEntity).leftJoin(qUserEntity).on(qFileEntity.userId.eq(qUserEntity.userId)).where(qFileEntity.canView.eq(true)).orderBy(qFileEntity.createTime.desc()).fetch();return result;
}

直接返回实体类

@Override
public List<UserEntity> checkUserInfo(String username) {QUserEntity qUserEntity = QUserEntity.userEntity;return queryFactory.selectFrom(qUserEntity).where(qUserEntity.userName.eq(username).and(qUserEntity.canView.eq(true))).fetch();
}

六、总结

QueryDSL 操作数据表做复杂查询是非常棒的。具体细节到官网查看吧

关注一个个人微信公众号吧!感谢!

Springboot之QueryDSL增强JPA操作相关推荐

  1. spring-boot (三) spring data jpa

    学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...

  2. SPRINGBOOT中如何运用JPA,简单例子

    SPRINGBOOT中如何运用JPA,简单例子 步骤 1 : JPA概念顶折 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活 ...

  3. python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】

    本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像 ...

  4. ASP.NET Core使用HostingStartup增强启动操作

    概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常 ...

  5. 针对springboot+gradle+querydsl中生成的Q类无法被识别报红的问题解决

    先不做任何配置,在项目能正常运行时点击build,查看Q类生成的具体地址,如图(我这是处理之后的) 然后在build.gradle中配置 注意,这里的路径只包含out/...../generated, ...

  6. core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...

  7. springboot从零开始,快捷键 快捷操作

    首先建一个maven 工程 idea main方法的快捷键是psvm 回车. maven 导入包,官方网站有 创建一个启动类.用注解. ctrl alt L 是代码修改快捷键. /在创建类的时候输入包 ...

  8. 第九章SpringBoot整合Spring Data JPA

    目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...

  9. SpringBoot集成Spring Data JPA多数据源(二)

    目录 1.引入依赖 2.application.yml配置文件 3.AtomikosJtaPlatform 4.事务管理器JPAAtomikosTransactionConfig 5.主数据源配置 6 ...

  10. SpringBoot:MyBatis增强版:MyBatis-Plus ---- 19

    ssss什么是MyBatis-Plus?MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.(建议安装 M ...

最新文章

  1. 一文详解SVM的Soft-Margin机制
  2. 为myeclipse分配更大的内存
  3. C#中创建文件并追加内容和换行
  4. java文件处理之压缩,分割
  5. else 策略模式去掉if_业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!...
  6. 结构方程模型-调节(干扰)效应检验(一)
  7. C语言OJ项目参考(2963) 判断三角形
  8. 小米max android7 root,小米Max第三方Rom-Lineage OS
  9. python识别图像中的文字
  10. java 运行 内存限制 + 远程调试
  11. java web 上传图片漏洞_Web安全:文件上传漏洞
  12. 新手学Python之学习官网教程(五: Data Structures)
  13. [经验教程]2022年淘宝/天猫/京东/拼多多等电商购物618年中大促活动是什么时候开始领取超级红包及优惠券入口?
  14. android无限轮播banner图片并且解决banner图片只有2张出现白板的情况,触摸即不轮播
  15. 55 非谓语动词语法
  16. mysql查询学校开设总课程数_MYSQL数据库课程设计
  17. 搜索引擎收录提交入口
  18. 贪心算法 绝对值不等式 C语言描述
  19. DEBUG系列一:Dumpdebug_SAP刘梦_新浪博客
  20. android 图片保存电脑上,怎样简单快速的将手机里的照片和视频,批量保存到电脑?...

热门文章

  1. 计算机字体对于现代设计有何意义,字体设计课程计算机授课方式的探索.doc
  2. 取消字体许可限制_字体许可和使用:您需要知道的
  3. 花了一天的时间给粉丝做了一个小米官网(高仿)
  4. 视频教程-2020年软考系统分析师--案例分析真题精解视频课程-软考
  5. PHP Smarty 学习手册
  6. 关于.Net WebProxy【转】
  7. [XJTUSE编译原理]第四章 语法分析——自上而下分析
  8. 【技术】jquery暂无图片替换
  9. 不用无限手套,人人都能开发BI系统
  10. 【智慧城市】-GIS数据获取SHP建筑数据获取总结