Springboot之QueryDSL增强JPA操作
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操作相关推荐
- spring-boot (三) spring data jpa
学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...
- SPRINGBOOT中如何运用JPA,简单例子
SPRINGBOOT中如何运用JPA,简单例子 步骤 1 : JPA概念顶折 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活 ...
- python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】
本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像 ...
- ASP.NET Core使用HostingStartup增强启动操作
概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常 ...
- 针对springboot+gradle+querydsl中生成的Q类无法被识别报红的问题解决
先不做任何配置,在项目能正常运行时点击build,查看Q类生成的具体地址,如图(我这是处理之后的) 然后在build.gradle中配置 注意,这里的路径只包含out/...../generated, ...
- core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...
- springboot从零开始,快捷键 快捷操作
首先建一个maven 工程 idea main方法的快捷键是psvm 回车. maven 导入包,官方网站有 创建一个启动类.用注解. ctrl alt L 是代码修改快捷键. /在创建类的时候输入包 ...
- 第九章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 ...
- SpringBoot集成Spring Data JPA多数据源(二)
目录 1.引入依赖 2.application.yml配置文件 3.AtomikosJtaPlatform 4.事务管理器JPAAtomikosTransactionConfig 5.主数据源配置 6 ...
- SpringBoot:MyBatis增强版:MyBatis-Plus ---- 19
ssss什么是MyBatis-Plus?MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.(建议安装 M ...
最新文章
- 一文详解SVM的Soft-Margin机制
- 为myeclipse分配更大的内存
- C#中创建文件并追加内容和换行
- java文件处理之压缩,分割
- else 策略模式去掉if_业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!...
- 结构方程模型-调节(干扰)效应检验(一)
- C语言OJ项目参考(2963) 判断三角形
- 小米max android7 root,小米Max第三方Rom-Lineage OS
- python识别图像中的文字
- java 运行 内存限制 + 远程调试
- java web 上传图片漏洞_Web安全:文件上传漏洞
- 新手学Python之学习官网教程(五: Data Structures)
- [经验教程]2022年淘宝/天猫/京东/拼多多等电商购物618年中大促活动是什么时候开始领取超级红包及优惠券入口?
- android无限轮播banner图片并且解决banner图片只有2张出现白板的情况,触摸即不轮播
- 55 非谓语动词语法
- mysql查询学校开设总课程数_MYSQL数据库课程设计
- 搜索引擎收录提交入口
- 贪心算法 绝对值不等式 C语言描述
- DEBUG系列一:Dumpdebug_SAP刘梦_新浪博客
- android 图片保存电脑上,怎样简单快速的将手机里的照片和视频,批量保存到电脑?...