Springboot + MySQL+ JPA Ⅶ querydsl使用方法

2023-11-02

一、pom.xml

1、添加依赖(版本号4.1会导致报错,使用4.4.0之后解决)

<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-apt</artifactId>
	<version>4.4.0</version>
</dependency>

<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-jpa</artifactId>
	<version>4.4.0</version>
</dependency>

2、添加脚本(用来生产Q文件的)

<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>

实体类写完后需要点击maven下面的compile来生成Q类文件

二、select单表

User类

@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer age;

    @ManyToOne  //user对work是多对一
    @JoinColumn(name="work_id")  //所对应的数据库的列是work_id
    private Work work;

}

Work类

@Data
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class Work {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
}

service

@Service
public class DslService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private EntityManager entityManager;

    private JPAQueryFactory jpaQueryFactory;

	//项目启动后就执行
    @PostConstruct
    public void initFactory()
    {
        jpaQueryFactory = new JPAQueryFactory(entityManager);
    }


    public List<User> getAll(){
		
        QUser qUser = QUser.user;
        QWork qWork = QWork.work;
		
        // queryFactory 是上方定义的工厂实体
        // select(生成的实体类的字段).from(生成实体类的名称).on(上方要查询的条件).orderBy(排序).fetch()进行查询
        Predicate predicate = qUser.work.id.eq(qWork.id);
        JPAQuery<User> jpaQuery = jpaQueryFactory.select(qUser).from(qUser)
                .leftJoin(qWork)
                .on(predicate)
                .orderBy(qUser.name.desc());
        List<User> list = jpaQuery.fetch();

        return list;
    }
}

control

@RestController
public class UserControl {
	
	@Autowired
    private DslService dslService;
	
	@GetMapping("/getAll")
    public List<User> getAll(){
        return dslService.getAll();
    }
	
}

三、多表返回的是Tuple,tuple.get(index,实体类.class)或者是tuple.get(q实体类)

public List<User> getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	JPAQuery<Tuple> jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.orderBy(qUser.name.desc());
	List<Tuple> list = jpaQuery.fetch();
	List<User> users = new ArrayList<>();
	list.forEach( (tuple) -> {
		String name = tuple.get(qUser).getName();  //tuple.get(0,User.class).getName()效果一样
		Integer age = tuple.get(qUser).getAge();
		Integer id = tuple.get(qUser).getId();
		Work work = tuple.get(qUser).getWork();
		User user = new User();
		user.setId(id);
		user.setName(name);
		user.setAge(age);
		user.setWork(work);
		users.add(user);
	});

	return users;
}

四、分页查询

public List<User> getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	Pageable pageable = PageRequest.of(1,5); //第二页,页面大小为5(可以由入参决定)
	JPAQuery<Tuple> jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.orderBy(qUser.name.desc());
	List<Tuple> list = jpaQuery.fetch();
	List<User> users = new ArrayList<>();
	list.forEach((tuple)->{
		String name = tuple.get(qUser).getName();
		Integer age = tuple.get(qUser).getAge();
		Integer id = tuple.get(qUser).getId();
		Work work = tuple.get(qUser).getWork();
		User user = new User();
		user.setId(id);
		user.setName(name);
		user.setAge(age);
		user.setWork(work);
		users.add(user);
	});

	return users;
}

附加:

获取的tuple类型可以通过流转换成集合(java8的特性)

public List<User> getAll(){

	QUser qUser = QUser.user;
	QWork qWork = QWork.work;

	// queryFactory 是上方定义的工厂实体
	// select(生成的实体类的字段).from(生成实体类的名称).where(上方要查询的条件).orderBy(排序).fetch()进行查询
	Predicate predicate = qUser.work.id.eq(qWork.id);
	Pageable pageable = PageRequest.of(1,5);
	JPAQuery<Tuple> jpaQuery = jpaQueryFactory.select(qUser,qWork.name).from(qUser)
			.leftJoin(qWork)
			.on(predicate)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.orderBy(qUser.name.desc());
	List<Tuple> list = jpaQuery.fetch();
	//遍历 java8 自带流转换成集合
	List<User> collect = list.stream().map(tuple -> {
		User user = tuple.get(qUser);
		return user;
	}).collect(Collectors.toList());
	return collect;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot + MySQL+ JPA Ⅶ querydsl使用方法 的相关文章

  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • MySQL 5左连接未知列

    我有以下查询在 mysql 4 1 中工作 但在 5 0 中不起作用 SELECT FROM email e event email ee LEFT JOIN member m on m email e email WHERE ee ema
  • 为什么在java中加载JNI是在静态初始化程序中完成的?

    在许多使用 JNI 的示例中 我看到类似以下内容 class SampleClass static System loadLibrary somelib 这种特殊语法的目的是什么 为什么使用这个 而不仅仅是在类构造函数或类似的东西中 我想你
  • 使用 IntelliJ 调试 Java 进程 - 连接到套接字但不连接到目标 VM

    现在已解决 请参阅问题末尾 我正在尝试使用 IntelliJ Community Edition 的调试器来调试 Java 进程 套接字正在侦听 但是当我尝试连接时 调试过程显示以下内容 连接到目标虚拟机 地址 8003 传输 socket
  • 结果显示图像上有衬里

    我正在使用 opencv 和 android ndk 下面是我的 jni 代码 void Vignete Mat img1 Mat img2 Mat out resize img1 img1 img2 size img1 convertTo
  • 自 Java 7 以来 HttpServer 延迟 1 秒

    我们正在使用内部HttpServer项目中的类 用于通过 HTTP 在客户端和服务器之间交换数据 当我们切换到 Java 7 时 我们意识到结果交付存在延迟 我们可以将问题简化为以下示例 Class EchoServer创建上下文 echo
  • ImageIO read() 和 write() 操作后 GIF 图像变得错误

    我有这个代码 它只是读取 GIF 文件 用背景重新绘制它 然后输出到新的 GIF 文件 问题是结果文件变得奇怪 我不知道为什么它的质量变得很差 JPG 文件不会出现此问题 如何修复它 import java awt Color import
  • Java JDT 解析器。获取VariableDeclarationFragment的变量类型

    我一直在用 JDT 实现 Java 解析器 但我不知道当变量的节点类型为变量声明片段 我只有在涉及到时才发现如何获取变量类型变量声明 我的代码如下 public boolean visit VariableDeclarationFragme
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • android.R.layout.simple_list_item_1是什么?

    在我看到的所有示例中 他们在创建 ArrayAdapter 时仅使用 android R layout simple list item 1 android R layout simple list item 1是什么 它只是一个名为sim
  • 通过命令行参数更改默认的 ant 目标

    最近我被分配了一个任务 让ant能够为不同的环境构建war包 除了一项功能外 我几乎完成了 蚂蚁接受一个env参数类似 Denv DEV 并使用不同的配置文件来制作war包 但默认目标是start它将构建 部署并启动 tomcat 我不希望
  • 在mysql中搜索“SanF”时获取旧金山的记录

    当我搜索 SanF 时获得 San Francisco 记录 SELECT FROM table WHERE col LIKE san Works SELECT FROM table WHERE col LIKE san F Works S
  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • 如何为信号量中等待的线程提供优先级?

    我使用信号量来限制访问函数的线程数量 我希望接下来要唤醒的线程应该由我将给出的某个优先级选择 而不是默认信号量唤醒它们的方式 我们怎样才能做到这一点 这是实现 class MyMathUtil2 implements Runnable do
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 为什么在 this 方法中添加 If 语句会大大降低速度?

    我在中遇到过这个回答另一个问题 https stackoverflow com questions 12233594 faster way to apply alpha to a jpeg in an android app 我试图诊断哪些
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por

随机推荐

  • [从零开始学DeepFaceLab-16]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - SAEHD模型训练参数详解与优化

    目录 前言 第1章 SAEHD模型训练参数详解 1 1 SAEHD参数汇总 默认 1 2 参数详解
  • 手把手教你:解决python UnicodeDecodeError: 'gb2312' codec can't decode问题

    问题 UnicodeDecodeError gb2312 codec can t decode bytes in position 2 3 illegal multibyte sequence 原因 python在做将普通字符串转换为uni
  • 【Github Action】使用ssh-deploy上传文件的小坑

    可以使用这个Github Action上传文件到服务器 https github com easingthemes ssh deploy README中描述了使用方法 name Deploy to Staging server uses e
  • FastAPI从入门到实战(13)——常见配置项

    这一部分的内容主要是一些常见的配置 包括路由 静态文件等 还包括一些路径和文档的修饰器 包括简介 标签参数等内容 配置静态文件 from fastapi import FastAPI from fastapi staticfiles imp
  • jvisualvm ssl远程连接JVM

    jvisualvm 远程ssl连接 文章目录 一 没认证的 JMX连接 不安全 二 SSL证书认证的JMX连接 安全 1 进入生成证书的目录 并执行脚本 2 一键生成密钥脚本 3 服务器端运行jar包时 开启ssl连接 4 客户端远程SSL
  • AR小项目的制作过程(一)

    前段时间一直想着初一个教程 怎么用unity去做一个AR小demo 在做之前先科普一下什么是AR AR技术也被称作是 增强现实 主要是一种将虚拟信息与真实世界巧妙融合的技术 现在光返的运用在很多方面 例如多媒体 3D建模 实时跟踪及注册 智
  • 如何在CentOS 8上使用firewalld设置防火墙

    介绍 Introduction firewalld is firewall management software available for many Linux distributions which acts as a fronten
  • JVM内存结构与内存模型

    JVM内存结构 前言 java开发人员不像C C 开发人员那样需要自己来管理内存 每一个对象从出生到死亡都需要由开发人员来管理 对于初级开发人员来说很容易出现内存问题 而java开发人员就很 幸运 了 内存的管理几乎全部交给JVM虚拟机来管
  • php 操作系统之间的一些黑魔法(绕过文件上传a.php/.)

    http wonderkun cc index html p 626 0x00 前言 做了一个CTF题目 遇到了一些有趣的东西 所以写了这篇文章记录了一下 但是我却不明白造成这个问题的原因在哪里 所以不知道给文章起什么标题 就姑且叫这个非常
  • 汇总

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 汇总图像语义分割那些质量最好的数据集与常用benchmark数据集 前言 图像语义分割是计算机视觉最经典的任务之一 早期的图像分割主要有以下几种实现方法 基于像素分布的分
  • 4.3、Flink任务怎样读取Kafka中的数据

    目录 1 添加pom依赖 2 API使用说明 3 这是一个完整的入门案例 4 Kafka消息应该如何解析 4 1 只获取Kafka消息的value部分 4 2 获取完整Kafka消息 key value Metadata 4 3 自定义Ka
  • 我读zookeeper源码系列1

    一 准备工作 1 zookeeper版本 01 zookeeper 3 4 x 企业最常用 大数据技术组件最常用 基本维持在 3 4 5 3 4 6 3 4 7 这几个版本 02 zookeeper 3 5 x 03 zookeeper 3
  • MYSQL的系统数据表空间,用户数据表空间,系统临时表空间,用户临时表空间详解

    系统数据表空间 系统表空间可以有一个或多个数据文件 默认情况下 会在数据目录中创建一个名为ibdata1的系统表空间数据文件 系统表空间数据文件的大小和数量由innodb data file path启动选项定义 mysql gt show
  • vue-element-admin教程

    vue element admin 是一个后台前端解决方案 它基于 vue 和 element ui实现 它使用了最新的前端技术栈 内置了 i18 国际化解决方案 动态路由 权限验证 提炼了典型的业务模型 提供了丰富的功能组件 它可以帮助你
  • 个人信贷违约预测代码实战

    本次分享一个数据挖掘实战项目 个人信贷违约预测 项目背景 当今社会 个人信贷业务发展迅速 但同时也会暴露较高的信用风险 信息不对称在金融贷款领域突出 在过去时期借款一方对自身的财务状况 还款能力及还款意愿有着较为全面的掌握 而金融机构不能全
  • c/c++,char型数组转化为int类型

    char型数组转int类型 这几天遇到需要将int等类型转换并保存在char数组中 同时还需要将char数组转换为int等类型进行显示 1 int等类型转换并保存在char数组中 int为4字节 char为1字节 由长变短 容易发出截断 数
  • 如何在 Flask 项目中使用 MQTT

    Flask 是一个使用 Python 编写的轻量级 Web 应用框架 其被称为 微框架 因为它使用简单的核心 用扩展增加其他功能 例如 ORM 窗体验证工具 文件上传 各种开放式身份验证技术等 MQTT 是一种基于发布 订阅模式的 轻量级物
  • linux窗口不能切换,linux一些技巧, 窗口切换 进入文字模式,设置错误无法启动等...

    一 如何进入文字模式 当安装Linux时 可选择自动后要进入文字模式或时图形模式 如果选择的时文字模式则可略过此说明 若是直接进入X Window的图形模式 仍可以使用下列方式 进入文字模式 1 在X Window中打开文字模式窗口 在默认
  • 【详解Vue中请求拦截器】

    文章目录 前言 一 安装依赖 二 定义拦截器 1 创建一个interceptors js文件用于定义拦截器 2 注册插件 3 发送请 总结 前言 提示 Vue请求拦截器通常用于在发送请求之前对请求进行一些处理 例如添加请求头 验证用户身份
  • Springboot + MySQL+ JPA Ⅶ querydsl使用方法

    一 pom xml 1 添加依赖 版本号4 1会导致报错 使用4 4 0之后解决