[软件开发] Jpa进阶,使用 Specification 进行高级查询
作者:CC下载站 日期:2022-06-08 00:00:00 浏览:58 分类:编程开发
前言
上一篇文章主要讲了 Jpa 的简单使用,而在实际项目中并不能满足我们的需求。如对多张表的关联查询,以及查询时需要的各种条件,这个时候你可以使用自定义 SQL 语句,但是Jpa并不希望我们这么做,于是就有了一个扩展:使用 Specification 进行查询
修改相应代码
1、修改 User.class
代码用的上一篇文章的,这里在 User 类中进行扩展,待会查询时会用到
@Entity
@Table(name = "user")
public class User {
//部分代码略
/**
* 加上该注解,在保存该实体时,Jpa将为我们自动设置上创建时间
*/
@CreationTimestamp
private Timestamp createTime;
/**
* 加上该注解,在保存或者修改该实体时,Jpa将为我们自动创建时间或更新日期
*/
@UpdateTimestamp
private Timestamp updateTime;
/**
* 关联角色,测试多表查询
*/
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
//部分代码略
}
2、新增Role.class
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true,nullable = false)
private String name;
//get set略
}
3、修改UserRepository
要使用 Specification,需要继承 JpaSpecificationExecutor 接口,修改后的代码如下
public interface UserRepo extends JpaRepository<User,Long>, JpaSpecificationExecutor {
}
4、查看 JpaSpecificationExecutor 源码
Specification 是 Spring Data JPA 提供的一个查询规范,这里所有的操作都是围绕 Specification 来进行
public interface JpaSpecificationExecutor<T> {
Optional<T> findOne(@Nullable Specification<T> var1);
List<T> findAll(@Nullable Specification<T> var1);
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
List<T> findAll(@Nullable Specification<T> var1, Sort var2);
long count(@Nullable Specification<T> var1);
}
封装查询Service
我这里简单做了下简单封装,编写 UserQueryService.class
@Service
public class UserQueryService {
@Autowired
private UserRepo userRepo;
/**
* 分页加高级查询
*/
public Page queryAll(User user, Pageable pageable , String roleName){
return userRepo.findAll(new UserSpec(user,roleName),pageable);
}
/**
* 不分页
*/
public List queryAll(User user){
return userRepo.findAll(new UserSpec(user));
}
class UserSpec implements Specification<User>{
private User user;
private String roleName;
public UserSpec(User user){
this.user = user;
}
public UserSpec(User user,String roleName){
this.user = user;
this.roleName = roleName;
}
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
/**
* 左连接,关联查询
*/
Join<Role,User> join = root.join("role",JoinType.LEFT);
if(!StringUtils.isEmpty(user.getId())){
/**
* 相等
*/
list.add(cb.equal(root.get("id").as(Long.class),user.getId()));
}
if(!StringUtils.isEmpty(user.getUsername())){
/**
* 模糊
*/
list.add(cb.like(root.get("username").as(String.class),"%"+user.getUsername()+"%"));
}
if(!StringUtils.isEmpty(roleName)){
/**
* 这里的join.get("name"),就是对应的Role.class里面的name
*/
list.add(cb.like(join.get("name").as(String.class),"%"+roleName+"%"));
}
if(!StringUtils.isEmpty(user.getCreateTime())){
/**
* 大于等于
*/
list.add(cb.greaterThanOrEqualTo(root.get("createTime").as(Timestamp.class),user.getCreateTime()));
}
if(!StringUtils.isEmpty(user.getUpdateTime())){
/**
* 小于等于
*/
list.add(cb.lessThanOrEqualTo(root.get("createTime").as(Timestamp.class),user.getUpdateTime()));
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}
}
}
查询测试
1、新增测试数据
@Test
public void test3() {
/**
* 新增角色
*/
Role role = new Role();
role.setName("测试角色");
role = roleRepo.save(role);
/**
* 新增并绑定角色
*/
User user = new User("小李",20,"男",role);
User user1 = new User("小花",21,"女",role);
userRepo.save(user);
userRepo.save(user1);
}
查看数据都已经新增成功了,并且 createTime 和 updateTime 也帮我们加上了
2、简单查询
@Test
public void Test4(){
/**
* 添加查询数据,模糊查询用户名
*/
User user = new User();
user.setUsername("花");
List<User> users = userQueryService.queryAll(user);
users.forEach(user1 -> {
System.out.println(user1.toString());
});
}
运行结果如下
3、分页+关联查询
@Test
public void test5() {
//页码,Pageable中默认是从0页开始
int page = 0;
//每页的个数
int size = 10;
Sort sort = new Sort(Sort.Direction.DESC,"id");
Pageable pageable = PageRequest.of(page,size,sort);
Page<User> users = userQueryService.queryAll(new User(),pageable,"测试角色");
System.out.println("总数据条数:"+users.getTotalElements());
System.out.println("总页数:"+users.getTotalPages());
System.out.println("当前页数:"+users.getNumber());
users.forEach(user1 -> {
System.out.println(user1.toString());
});
}
}
通过角色的名称查询用户,运行结果如下
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[网盘管理] PanTools v1.0.18 多网盘批量管理 批量分享、转存、复制
[电影] 2010年国产经典武侠片《镖行天下前传之四百里加急》HD国语中字
[游戏娱乐] 《创世理想乡》v20240314中文版
[云资源] 花了一千多元买的私人健身教程
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[电影] 2023年中国台湾惊悚片《恶女》HD国语中字
[电影] 2007年国产经典动作片《镖行天下之神武大炮》HD国语中字
[游玩] 地道春茶地图:中国最美的春天都藏在这里!
[电影] 2020年国产动作片《玄天风云》HD国语中字
[影视] 漂流人生 WEB-DL版下载/漂流人生(港) 2023 Drift 6.29G
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[云资源] 花了一千多元买的私人健身教程
[下载工具] Internet Download Manager 6.42.7 (IDM)
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[即时通讯] 腾讯QQ PC版9.7.22.29315去广告绿色纯净版
[开发环境] PhpStorm2023中文激活版v2023.3.3 正式版
[图像制作] Adobe Illustrator 2024 v28.1.0.141 破解版
[资料] 3000 套电影电视剧 LOGO 宣传片常用音效合集包
[截图软件] HyperSnap(截图软件)_v9.4.0.00_汉化破解版
[安卓软件] 酷我音乐APP_v10.7.6.4 去广告破解豪华VIP版
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[云资源] 花了一千多元买的私人健身教程
[安卓软件] Android GIF助手 v3.9.7 GIF图片编辑器破解版
[电视剧] 三体 (2024) 全8集 网飞版本 中文字幕 合集
[剧集] 繁花 (2023)[全30集][打包]
[影视] 三大队 WEB-DL版下载/Endless Journey/请转告局长,三大队任务完成了 2023 三大队 6.7G
[纪录片] 河西走廊【10集 国语 中文字幕 1080P 10.8G MP4】
[安卓软件] OfficeSuite中文版APP v14.2.50872.0破解版
[影视] 涉过愤怒的海 WEB-DL版下载/怒海 / Across the Furious Sea 2023 涉过愤怒的海 26.3G
[电影] 2024年喜剧片·热辣滚烫 [mp4]
- 最新评论
-
谢谢支持!!CC下载站 评论于:03-26 很棒的资源,感谢分享云体风身 评论于:03-26 感谢分享,好东西云体风身 评论于:03-26 谢谢支持!CC下载站 评论于:03-14 央视精品,感谢付出提供。qwer9009 评论于:03-14 谢谢支持!!!CC下载站 评论于:03-13 谢谢分享!Ypc9182 评论于:03-12 谢谢支持!!CC下载站 评论于:03-11 感谢本网站收集和提供这么多的资料,谢谢!Ypc9182 评论于:03-10 很棒的资源,支持一下lingzhi007 评论于:03-10
- 热门tag