说明: 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 实践相关推荐

  1. querydsl动态 sql_Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一.  诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...

  2. Fenix — 比 MyBatis 更加强大的 Spring Data JPA 扩展库

    Fenix(菲尼克斯)是一个比 MyBatis 更加强大,为解决复杂.动态 SQL (JPQL) 而生的 Spring Data JPA 扩展库,目的是辅助开发者更方便.快捷的书写复杂.动态且易于维护 ...

  3. Spring data jpa 条件查询-按时间段查询

    Spring data jpa 条件查询-按时间段查询 @Overridepublic Page<泛型> findRecordList(int couponDetailId, int pa ...

  4. Spring Data JPA REST Query QueryDSL

    案例概述 在本教程中,我们将研究使用Spring Data JPA和Querydsl为REST API构建查询语言. 在本系列的前两篇文章中,我们使用JPA Criteria和Spring Data ...

  5. jpa多表联查动态_Spring Data JPA实现动态多表关联查询

    在面向关系型数据库(例如:MySQL)的查询中,动态的.多表关联的查询属于比较复杂的情况.所以,我们只要掌握了这种复杂的查询,当面对其他查询情况时,就能做到胸有成竹. 在java工程中,目前我所了解到 ...

  6. jpa多表联查动态_Spring Data JPA 连表动态条件查询

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...

  7. Spring Data JPA 实例查询

    转自:https://www.cnblogs.com/rulian/p/6533109.html 一.相关接口方法 在继承JpaRepository接口后,自动拥有了按"实例"进行 ...

  8. mysql jpa 正则_Spring Data JPA 实例查询

    数量:1 刘芳 三.认识"实例查询" 1.概念定义: 上面例子中,是这样创建"实例"的:Example ex = Example.of(customer, ma ...

  9. 005_Spring Data JPA条件查询

    1. 创建一个名为spring-data-jpa-specification-executor的Java项目, 同时添加相关jar包, 并添加JUnit能力. 2. 查看JpaSpecificatio ...

  10. Spring Data JPA 条件查询的关键字

    Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下: And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(Stri ...

最新文章

  1. mysql 多个字段拼接
  2. json.dumps和loads方法
  3. 技术团队的情绪与效率
  4. Centos定时自动执行脚本
  5. TOJ 3046: 招商银行网络系统
  6. 学习 | egg.js 中间件和插件
  7. ShortcutMapper 是应用程序的键盘快捷键
  8. CSS学习总结(4)——盒模型/背景属性
  9. iOS开发UI篇—无限轮播(循环展示)
  10. 为什么训练时测试准确率大幅度波动_Nature Mach Intell|类药性预测准确率有极限...
  11. 典型关联分析(CCA)原理总结
  12. 致远OA漏洞学习——帆软组件 ReportServer 目录遍历漏洞
  13. gcc -m32报错的解决办法
  14. 以太网接口 数据采集 matlab,基于以太网接口并行多通道采集器的设计
  15. k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
  16. 新手初学Java List 接口
  17. matlab中文帮助_MATLAB数据及图像处理与机器学习培训
  18. 白话智能锁—卡片钥匙安全
  19. 红旗linux超级管理员root 密码恢复,修改redflag启动级别
  20. java毕业设计_银行账目管理系统

热门文章

  1. java手机单机游戏_手机单机游戏推荐简介
  2. CPU监控工具(CPU使用率及CPU温度监控)
  3. 创建数独小游戏uniapp/vue
  4. windows命令大全
  5. 基于OpenCore0.5.4/5/6,初级配置视频与文字
  6. MockingBrid(AI拟声)教程
  7. android 动态获取权限
  8. 数分统计学基础知识框架。
  9. DB2 改变日期格式
  10. 服务器中tomcat内存溢出配置文件修改