jpa整合querydsl实现简单查询以及左联查询
用意: 为了解决jpa复杂查询以及多表查询难以的问题,故找到该神器(querydsl),使用该框架后,可以使jpa像mybatis一样灵活,随心所欲。下面的代码只展示了常用的mysql操作,包含动态查询、左联查询、分页、排序,如需其他操作,请移步到官网
如果你也在为jpa多表查询而烦恼,那么这篇文章就很适合你.
该项目由springboot+jpa+querydbsl整合,详细的配置这里就不说了,只展示主要部分.
1.导入pom
<!-- queryDSL --><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId></dependency><!-- queryDSL --><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><scope>provided</scope></dependency><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--因为是类型安全的,所以还需要加上Maven APT plugin,使用 APT 自动生成一些类:--><plugin><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>
- 创建实体类
@Entity
@Getter
@Setter
@ToString
@Accessors(fluent = true)
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "t_user")
public class User extends IdEntity {/** 用户名 */private String username;/** 密码 */private String password;/** 性别 */private String sex;/** 年龄 */private String age;/** 地址 */private String address;/** 角色id */private Long roleId;
}
- 创建repository接口
@Repositorypublic interface UserRepository extends JpaRepository<User,Long>, QuerydslPredicateExecutor<User> {}
生成Q实体(举例: user实体生成实体后会有一个QUser的类,该框架操作的是QUser类,而不是直接的是实体类)
创建service接口实现类
@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserRepository userRepository;@PersistenceContextprivate EntityManager entityManager;/*** 添加用户** @return user*/@Overridepublic User saveUser() {User address = new User().username("admin").password("123456").age("12").sex("男").address("山西省");return userRepository.save(address);}/*** 通过id查询** @param id 数据id* @return Optional<User>*/@Overridepublic Optional<User> findById(Long id) {QUser qUser = QUser.user;BooleanExpression eq = qUser.id.eq(id);return userRepository.findOne(eq);}/*** 查询所有** @return List<RoUser>*/@Overridepublic List<RoUser> findAll() {JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);QUser qUser = QUser.user;QRole qRole = QRole.role;QBean<RoUser> bean = Projections.bean(RoUser.class,//返回自定义实体的类型qUser.id,qUser.username,qUser.password,qUser.sex,qUser.age,qUser.address,qRole.roleName,qRole.remark);// 返回分页参数的信息queryFactory.select(bean) // 返回自定义实体.from(qUser) // 主表.leftJoin(qRole) // 从表.on(qUser.roleId.eq(qRole.id) // on 条件).where(qUser.id.eq(2L)) // where 条件.orderBy(qUser.createTime.desc()) // 排序.offset(1).limit(10) // 分页.fetchResults();return queryFactory.select(bean) // 返回自定义实体.from(qUser) // 主表.leftJoin(qRole) // 从表.on(qUser.roleId.eq(qRole.id) // on 条件).where(qUser.id.eq(2L)) // where 条件.fetch();}/*** 动态查询 + 子查询 + 分页 + 排序** @return List<RoUser>*/@Overridepublic QueryResults<RoUser> findAll(String username, Long roleId) {JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);QUser qUser = QUser.user;QRole qRole = QRole.role;QBean<RoUser> bean = Projections.bean(RoUser.class,//返回自定义实体的类型qUser.id,qUser.username,qUser.password,qUser.sex,qUser.age,qUser.address,qRole.roleName,qRole.remark);// 定义返回类型JPAQuery<RoUser> from = queryFactory.select(bean) // 返回自定义实体.from(qUser);// 主表// 模糊查询名字if (StringUtils.isNotBlank(username)) {from.where(qUser.username.like("%" + username + "%"));}if (null != roleId) {from.where(qUser.roleId.eq(roleId));}return from.leftJoin(qRole).on(qUser.roleId.eq(qRole.id)) // on 子查询.orderBy(qUser.createTime.desc()) // 排序.offset(0) // 起始页.limit(10) // 限制条数.fetchResults();}
}
项目源文件:源文件
jpa整合querydsl实现简单查询以及左联查询相关推荐
- Spring JPA整合QueryDSL
前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架 ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
- SQL-在Update中进行子查询和左联查询
以下总结源自后边的三个参考思索和测试而来: 我们有一张行政区划表,为了查询速度的优化,我们需要在这张表中,将每个乡镇的记录中写入其所属的省.市.县, 表如下: 当然,我们可以使用游标或在存储过程中使用 ...
- 简单的mysql左联查询实例
select * from t1 left join t2 on t1.id=t2.id where t1.xm1='123'
- springboot整合JPA+MYSQL+queryDSL数据增删改查
Spring Boot Jpa 是 Spring 基于 ORM 框架.Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...
- java dsl框架_Spring Boot整合QueryDSL的实现示例
之前研究Jooq,今天来研究一下搭配JPA的QueryDSL吧. 简介 Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句.它采用API代替拼凑字符串来构造查询语句.可跟 Hibe ...
- Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询
前言 本来该篇教程就应该写到 Springboot 整合 ElasticSearch 入门教学必看 https://blog.csdn.net/qq_35387940/article/details/ ...
- JPA 和 QueryDSL
querydsl极简入门 QueryDSL+gradle+idea spring boot-jpa整合QueryDSL 关于 QueryDSL 配置和使用(详细) querydls关联查询 query ...
- jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询
jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...
最新文章
- join为什么每个字符都分割了 js_js的join()与 split() (转)
- IOS15使用Masonry和自动计算Cell的高度
- 搜狗输入法电脑版_搜狗输入法就是垃圾!!!大大的垃圾!
- java怎么看dao文件_java通过实体类生成dao文件
- 算法之矩阵计算斐波那契数列
- java trie实现
- python回归预测例子_案例实战 | 逻辑回归实现客户流失预测(附Python代码与源数据)...
- android config.mk,android编译分析之10—config.mk
- c#中connect函数_C#.NET 各种连接字符串
- 设计模式之代理:手动实现动态代理,揭秘原理实现
- 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)
- Android实战——Activity超详细学习笔记
- 软件开发的文档与审查
- selnium 判断页面加载完成_Selenium_等待页面加载完毕
- Rust游戏数据查询、Rust服务器清档时间表
- 【终结版】小家电安规要求以及世界各国安规认证知识分享
- HCIE-RS 论述题园区网出口选路
- mediasoup中nack的调用机制
- C1认证学习二十六(基础选择器)
- pdf大小如何压缩?