用意: 为了解决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>
  1. 创建实体类
@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;
}
  1. 创建repository接口
 @Repositorypublic interface UserRepository extends JpaRepository<User,Long>, QuerydslPredicateExecutor<User> {}
  1. 生成Q实体(举例: user实体生成实体后会有一个QUser的类,该框架操作的是QUser类,而不是直接的是实体类)

  2. 创建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实现简单查询以及左联查询相关推荐

  1. Spring JPA整合QueryDSL

    前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架 ...

  2. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

  3. SQL-在Update中进行子查询和左联查询

    以下总结源自后边的三个参考思索和测试而来: 我们有一张行政区划表,为了查询速度的优化,我们需要在这张表中,将每个乡镇的记录中写入其所属的省.市.县, 表如下: 当然,我们可以使用游标或在存储过程中使用 ...

  4. 简单的mysql左联查询实例

    select * from t1 left join t2 on t1.id=t2.id where t1.xm1='123'

  5. springboot整合JPA+MYSQL+queryDSL数据增删改查

    Spring Boot Jpa 是 Spring 基于 ORM 框架.Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...

  6. java dsl框架_Spring Boot整合QueryDSL的实现示例

    之前研究Jooq,今天来研究一下搭配JPA的QueryDSL吧. 简介 Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句.它采用API代替拼凑字符串来构造查询语句.可跟 Hibe ...

  7. Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    前言 本来该篇教程就应该写到 Springboot 整合 ElasticSearch 入门教学必看 https://blog.csdn.net/qq_35387940/article/details/ ...

  8. JPA 和 QueryDSL

    querydsl极简入门 QueryDSL+gradle+idea spring boot-jpa整合QueryDSL 关于 QueryDSL 配置和使用(详细) querydls关联查询 query ...

  9. jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询

    jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...

最新文章

  1. join为什么每个字符都分割了 js_js的join()与 split() (转)
  2. IOS15使用Masonry和自动计算Cell的高度
  3. 搜狗输入法电脑版_搜狗输入法就是垃圾!!!大大的垃圾!
  4. java怎么看dao文件_java通过实体类生成dao文件
  5. 算法之矩阵计算斐波那契数列
  6. java trie实现
  7. python回归预测例子_案例实战 | 逻辑回归实现客户流失预测(附Python代码与源数据)...
  8. android config.mk,android编译分析之10—config.mk
  9. c#中connect函数_C#.NET 各种连接字符串
  10. 设计模式之代理:手动实现动态代理,揭秘原理实现
  11. 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)
  12. Android实战——Activity超详细学习笔记
  13. 软件开发的文档与审查
  14. selnium 判断页面加载完成_Selenium_等待页面加载完毕
  15. Rust游戏数据查询、Rust服务器清档时间表
  16. 【终结版】小家电安规要求以及世界各国安规认证知识分享
  17. HCIE-RS 论述题园区网出口选路
  18. mediasoup中nack的调用机制
  19. C1认证学习二十六(基础选择器)
  20. pdf大小如何压缩?

热门文章

  1. 关闭centos7下哔哔声
  2. 几张趣图带你了解程序员眼中的世界
  3. 技术博客一件发布系统的实验性技术方案Butterfly
  4. 关于Proteus的复制粘贴快键
  5. 个人博客系统之框架搭建
  6. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?
  7. latex:ieee摘要两端对齐
  8. 什么是币圈跨链侧链?
  9. 【国产数据库】GBase学习⑤ - gsql 客户端连接工具
  10. 2019全网最全面试详解.