当前位置: 首页 > news >正文

JPA-Specification常用条件查询构造方式

JPA-Specification常用条件查询构造方式

1.toPredicate方法

Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);

1.1 Root< User >root

<Y> Path<Y> get(String attributeName);
  • 这个root就相当于查询和操作的实体对象的根,我们就可以通过Path get(xx)的方法,来获取我们想要操作的字段。
predicateList.add(cb.like(root.get("name"),userQuery.getName()));

1.2 CriteriaQuery<?> query

public interface CriteriaQuery<T> extends AbstractQuery<T> {
    CriteriaQuery<T> select(Selection<? extends T> var1);
    CriteriaQuery<T> multiselect(Selection<?>... var1);
    CriteriaQuery<T> multiselect(List<Selection<?>> var1);
    CriteriaQuery<T> where(Expression<Boolean> var1);
    CriteriaQuery<T> where(Predicate... var1);
    CriteriaQuery<T> groupBy(Expression<?>... var1);
    CriteriaQuery<T> groupBy(List<Expression<?>> var1);
    CriteriaQuery<T> having(Expression<Boolean> var1);
    CriteriaQuery<T> having(Predicate... var1);
    CriteriaQuery<T> orderBy(Order... var1);
    CriteriaQuery<T> orderBy(List<Order> var1);
    CriteriaQuery<T> distinct(boolean var1);
    List<Order> getOrderList();
    Set<ParameterExpression<?>> getParameters();
}
  • 这是一个Specific的顶层查询对象,它包含着查询的各个部分,比如select、from、where、group by 、Order by、distinct等。提供查询Root的方法
return query.where(predicateList.toArray(new Predicate[predicateList.size()]))
.groupBy(root.get("age")).getRestriction();

1.3 CriteriaBuilder cb

在这里插入图片描述

  • CriteriaBuilder是用来构建CritiaQuery的构建对象,其实就相当于条件或者条件组合,并以Predicate的形式返回,基本提供了所有常用的方法。
predicateList.add(cb.equal(root.get("sex"),userQuery.getSex()));
predicateList.add(cb.like(root.get("name"),userQuery.getName()));
predicateList.add(cb.greaterThanOrEqualTo(root.get("age"),userQuery.getAge()));

2.常见单表查询

//like查询
predicateList.add(cb.like(root.get("instanceName").as(String.class), "%" + s + "%"));

//in查询
Path<Object> productIdPath = root.get("productId");
In<Object> in = cb.in(productIdPath);
for (Integer productId : request.getPermissionProductIds()) {
    in.value(productId);
}
predicateList.add(in);

//equal查询
predicateList.add(cb.equal(root.get("engine").as(String.class), request.getEngine()));

//or查询
predicates.add(cb.or(
        cb.like(root.get("note").as(String.class), "%" + request.getKeyword() + "%"),
        cb.like(root.get("wanIp").as(String.class), "%" + request.getKeyword() + "%")
));

//根据时间范围查询
if (!StringUtils.isEmpty(request.getStartDate())) {
    predicates.add(cb.greaterThan(root.get("beginTime").as(String.class), request.getStartDate() + " 00:00:00"));
}
if (!StringUtils.isEmpty(request.getEndDate())) {
    predicates.add(cb.lessThan(root.get("beginTime").as(String.class), request.getEndDate() + " 23:59:59"));
}

3.多表Join查询

  • DbInstanceModel实体
@Entity
@Table(name = "cc_cloud_db_instance")
public class DbInstanceModel extends BaseModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String instanceName;

    private String instanceId;

    @OneToMany(cascade = {CascadeType.REMOVE}, fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    @JoinColumn(name = "instanceId", referencedColumnName = "instanceId")
    @NotFound(action=NotFoundAction.IGNORE)
    private List<DbInstanceProductModel> products;
}
  • DbInstanceProductModel实体
@Data
@Entity
@Table(name = "cc_cloud_db_instance_product")
public class DbInstanceProductModel extends BaseModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


    private String instanceId;


    private Integer productId;

    @ManyToOne
    @JoinColumn(name = "instanceId", referencedColumnName = "instanceId", insertable = false, updatable = false)
    public DbInstanceModel instance;
}
  • 关联代码
Join<DbInstanceModel, DbInstanceProductModel> productJoin = root.join("products", JoinType.LEFT);

predicates.add(cb.equal(productJoin.get("productId"), request.getProductId()));

4.子查询

Subquery<Integer> subQuery = query.subquery(Integer.class);
Root<DbInstanceProductModel> fromUR = subQuery.from(DbInstanceProductModel.class);
subQuery.select(fromUR.get("instanceId"));
permissionPredicates.add(cb.in(root.get("instanceId")).value(subQuery));

5.分页&排序

//方式1:
Pageable pageable = PageRequest.of(request.getPage() - 1,request.getLimit().intValue(),
Sort.Direction.DESC,"createTime");

//方式2(可根据多个字段排序):
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(request.getPage() - 1, request.getLimit(), sort);

6.条件封装

//单纯AND条件
Predicate[] pre = new Predicate[predicates.size()];
return query.where(predicates.toArray(pre)).getRestriction();

//复杂类型
return cb.and(cb.and(cb.and(predicates.toArray(new Predicate[0])), 
cb.or(permissionPredicates.toArray(new Predicate[0]))), constPredicate);

相关文章:

  • 瑞吉外卖(19) - 新增套餐业务开发
  • Android 的定位分层架构
  • 基于docker搭建es集群
  • 2.可视化基础(上)
  • 解决Vue项目中ESLint和Prettier冲突问题[Vue.js项目实践: 新冠自检系统]
  • 【misc】buu-面具下的flag——zip伪加密+用NTFS流隐藏文件
  • java毕业设计企业安全与设备管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  • Message Bus Solace Deeper Dive
  • Android-AGP之手写你的第一款自定义plugin插件
  • 入门力扣自学笔记159 C++ (题目编号788)
  • java毕业设计奇妙店铺电子商务网站源码+lw文档+mybatis+系统+mysql数据库+调试
  • 类与对象(十四)----包package
  • Codeforces Round #820 (Div. 3)A. Two Elevators
  • 实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑
  • (pt可视化)利用torch的make_grid进行张量可视化
  • 2017-09-12 前端日报
  • Effective Java 笔记(一)
  • HomeBrew常规使用教程
  • IDEA常用插件整理
  • JAVA多线程机制解析-volatilesynchronized
  • Java小白进阶笔记(3)-初级面向对象
  • leetcode46 Permutation 排列组合
  • Map集合、散列表、红黑树介绍
  • mysql 数据库四种事务隔离级别
  • Redis学习笔记 - pipline(流水线、管道)
  • 关于springcloud Gateway中的限流
  • 力扣(LeetCode)357
  • 使用docker-compose进行多节点部署
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • ​如何防止网络攻击?
  • #宝哥教你#查看jquery绑定的事件函数
  • (1)常见O(n^2)排序算法解析
  • (10)STL算法之搜索(二) 二分查找
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (三) diretfbrc详解
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (算法)Game
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 未来三学期想要修的课 (日記)
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 受管制代码
  • /etc/motd and /etc/issue
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @拔赤:Web前端开发十日谈
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 数据结构 - C++]红黑树RBTree
  • [.NET]桃源网络硬盘 v7.4
  • [Angularjs]ng-select和ng-options
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++]类和对象(中)
  • [CF482B]Interesting Array