querydsl动态 sql_Spring-data-jpa扩展查询 QueryDSL 实践
说明: QueryDSL是以函数连接的方式将SQL调用进行拆分,比较spring data jpa中的criteria查询方法还是简洁了不少。 (转载请注明来源:cnblogs coder-fang)
用例:通过服务调用,使用querydsl进行查询并直接返回DTO对象(自定义传输对象(根据业务需求),注意区别于Entity)
实践步骤:
1. 创建user与depart表,使用外键进行关联,并插入一些模拟数据。
2. 创建sprintboot项目,在pom文件中加入以下依赖:
com.querydsl
querydsl-jpa
com.querydsl
querydsl-apt
provided
3. 在pom文件中-->节点下加入plugin:
com.mysema.maven
apt-maven-plugin
1.1.3
process
target/generated-sources/java
com.querydsl.apt.jpa.JPAAnnotationProcessor
com.querydsl
querydsl-apt
4.1.3
4. 生成相关entity与repository对象,这里以user为例:
packagecom.test.demo.db;//
importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;import staticjavax.persistence.GenerationType.IDENTITY;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Table;/*** User generated by hbm2java*/@Entity
@Table(name= "user", catalog = "testdb")public class User implementsjava.io.Serializable {privateInteger id;privateDepartment department;privateString username;publicUser() {
}publicUser(Department department, String username) {this.department =department;this.username =username;
}
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(name= "id", unique = true, nullable = false)publicInteger getId() {return this.id;
}public voidsetId(Integer id) {this.id =id;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name= "fk_depart")publicDepartment getDepartment() {return this.department;
}public voidsetDepartment(Department department) {this.department =department;
}
@Column(name= "username", length = 45)publicString getUsername() {return this.username;
}public voidsetUsername(String username) {this.username =username;
}
}
View Code
packagecom.test.demo.repo;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.JpaSpecificationExecutor;importorg.springframework.data.querydsl.QueryDslPredicateExecutor;importorg.springframework.stereotype.Repository;importcom.test.demo.db.User;
@Repositorypublic interface UserRepository extends QueryDslPredicateExecutor, JpaRepository,JpaSpecificationExecutor{
}
View Code
注意:repository需要继承 QueryDslPredicateExecutor接口。
5. 生成业务传输对象DTO:
packagecom.test.demo.controller;importcom.querydsl.core.annotations.QueryProjection;importlombok.Data;
@SuppressWarnings("unused")public @Data classUserDTO {privateString username;privateString departname;
}
6. 创建controller进行测试:
packagecom.test.demo.controller;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.PostConstruct;importjavax.persistence.EntityManager;importjavax.persistence.PersistenceContext;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importcom.querydsl.core.types.Projections;importcom.querydsl.core.types.dsl.BooleanExpression;importcom.querydsl.jpa.impl.JPAQuery;importcom.querydsl.jpa.impl.JPAQueryFactory;importcom.test.demo.db.QUser;importcom.test.demo.repo.UserRepository;
@RestController
@RequestMapping("/")public classTestController {
@Autowired
UserRepository userRepo;
@Autowired
@PersistenceContext
EntityManager em;privateJPAQueryFactory queryFactory;
@PostConstructpublic voidinit() {
queryFactory= newJPAQueryFactory(em);
}
@RequestMapping("/users")
Object getUsers(@RequestParam(value= "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value= "size", required = false, defaultValue = "10") Integer size,
@RequestParam(value= "name", required = false) String name,
@RequestParam(value= "depart", required = false) String depart) {
QUser user=QUser.user;
JPAQuery query =queryFactory
.select(Projections.bean(UserDTO.class, user.username, user.department.name.as("departname")))
.from(user);
BooleanExpression pre= null;if (name!=null && !name.isEmpty()) {
pre=user.username.startsWith(name);
}if (depart!=null && !depart.isEmpty()) {
pre=user.department.name.startsWith(depart);
}
query.where(pre);
query.limit(size);
query.offset((page-1)*size);
List result =query.fetch();
Map map = new HashMap<>();
map.put("total", userRepo.count(pre));
map.put("data", result);returnmap;
}
}
View Code
注:这里就是使用querydsl进行查询,并直接转换需要的属性至DTO。并且代码中的pre是可以根据参数动态拼接的。
7. 测试结果:
这是查询日志:
完。
querydsl动态 sql_Spring-data-jpa扩展查询 QueryDSL 实践相关推荐
- querydsl动态 sql_Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一. 诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...
- Fenix — 比 MyBatis 更加强大的 Spring Data JPA 扩展库
Fenix(菲尼克斯)是一个比 MyBatis 更加强大,为解决复杂.动态 SQL (JPQL) 而生的 Spring Data JPA 扩展库,目的是辅助开发者更方便.快捷的书写复杂.动态且易于维护 ...
- Spring data jpa 条件查询-按时间段查询
Spring data jpa 条件查询-按时间段查询 @Overridepublic Page<泛型> findRecordList(int couponDetailId, int pa ...
- Spring Data JPA REST Query QueryDSL
案例概述 在本教程中,我们将研究使用Spring Data JPA和Querydsl为REST API构建查询语言. 在本系列的前两篇文章中,我们使用JPA Criteria和Spring Data ...
- jpa多表联查动态_Spring Data JPA实现动态多表关联查询
在面向关系型数据库(例如:MySQL)的查询中,动态的.多表关联的查询属于比较复杂的情况.所以,我们只要掌握了这种复杂的查询,当面对其他查询情况时,就能做到胸有成竹. 在java工程中,目前我所了解到 ...
- jpa多表联查动态_Spring Data JPA 连表动态条件查询
多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...
- Spring Data JPA 实例查询
转自:https://www.cnblogs.com/rulian/p/6533109.html 一.相关接口方法 在继承JpaRepository接口后,自动拥有了按"实例"进行 ...
- mysql jpa 正则_Spring Data JPA 实例查询
数量:1 刘芳 三.认识"实例查询" 1.概念定义: 上面例子中,是这样创建"实例"的:Example ex = Example.of(customer, ma ...
- 005_Spring Data JPA条件查询
1. 创建一个名为spring-data-jpa-specification-executor的Java项目, 同时添加相关jar包, 并添加JUnit能力. 2. 查看JpaSpecificatio ...
- Spring Data JPA 条件查询的关键字
Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下: And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(Stri ...
最新文章
- mysql 多个字段拼接
- json.dumps和loads方法
- 技术团队的情绪与效率
- Centos定时自动执行脚本
- TOJ 3046: 招商银行网络系统
- 学习 | egg.js 中间件和插件
- ShortcutMapper 是应用程序的键盘快捷键
- CSS学习总结(4)——盒模型/背景属性
- iOS开发UI篇—无限轮播(循环展示)
- 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...
- 典型关联分析(CCA)原理总结
- 致远OA漏洞学习——帆软组件 ReportServer 目录遍历漏洞
- gcc -m32报错的解决办法
- 以太网接口 数据采集 matlab,基于以太网接口并行多通道采集器的设计
- k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
- 新手初学Java List 接口
- matlab中文帮助_MATLAB数据及图像处理与机器学习培训
- 白话智能锁—卡片钥匙安全
- 红旗linux超级管理员root 密码恢复,修改redflag启动级别
- java毕业设计_银行账目管理系统