前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入理解 QueryDSL 的 BooleanBuilder:构建复杂逻辑表达式

深入理解 QueryDSL 的 BooleanBuilder:构建复杂逻辑表达式

作者头像
訾博ZiBo
发布于 2025-01-06 12:47:58
发布于 2025-01-06 12:47:58
18200
代码可运行
举报
运行总次数:0
代码可运行

深入理解 QueryDSL 的 BooleanBuilder:构建复杂逻辑表达式

Java 的查询构建库 QueryDSL 中, BooleanBuilder 是一个非常有用的工具类。它允许开发者通过链式调用轻松地构建复杂的布尔逻辑表达式。本文将详细介绍 BooleanBuilder 的各种方法,并通过代码示例展示如何使用这些方法。

一、方法介绍

1. 构造方法

默认构造方法

BooleanBuilder() 是一个无参构造方法,用于初始化一个空的 BooleanBuilder 实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BooleanBuilder builder = new BooleanBuilder();
带初始值的构造方法

BooleanBuilder(Predicate initial) 使用一个初始的 Predicate 对象来构造 BooleanBuilder 实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate initialPredicate = QEntity.entity.field.eq("value");
BooleanBuilder builder = new BooleanBuilder(initialPredicate);

2. 逻辑运算方法

and 方法

BooleanBuilder and(@Nullable Predicate right) 用于将当前谓词与 right 谓词进行逻辑“与”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate1 = QEntity.entity.field1.eq("value1");
Predicate predicate2 = QEntity.entity.field2.eq("value2");
BooleanBuilder builder = new BooleanBuilder(predicate1);
builder.and(predicate2);
// 结果为:field1 = "value1" AND field2 = "value2"
andAnyOf 方法

BooleanBuilder andAnyOf(Predicate... args) 将当前谓词与多个谓词中的任意一个进行逻辑“与”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate3 = QEntity.entity.field3.eq("value3");
Predicate predicate4 = QEntity.entity.field4.eq("value4");
builder.andAnyOf(predicate3, predicate4);
// 结果为:field1 = "value1" AND field2 = "value2" AND (field3 = "value3" OR field4 = "value4")
andNot 方法

BooleanBuilder andNot(Predicate right) 将当前谓词与 right 谓词的“非”进行逻辑“与”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate5 = QEntity.entity.field5.eq("value5");
builder.andNot(predicate5);
// 结果为:field1 = "value1" AND field2 = "value2" AND NOT field5 = "value5"
or 方法

BooleanBuilder or(@Nullable Predicate right) 将当前谓词与 right 谓词进行逻辑“或”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate6 = QEntity.entity.field6.eq("value6");
builder.or(predicate6);
// 结果为:(field1 = "value1" AND field2 = "value2") OR field6 = "value6"
orAllOf 方法

BooleanBuilder orAllOf(Predicate... args) 将当前谓词与多个谓词中的所有进行逻辑“或”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate7 = QEntity.entity.field7.eq("value7");
Predicate predicate8 = QEntity.entity.field8.eq("value8");
builder.orAllOf(predicate7, predicate8);
// 结果为:(field1 = "value1" AND field2 = "value2") OR (field7 = "value7" AND field8 = "value8")
orNot 方法

BooleanBuilder orNot(Predicate right) 将当前谓词与 right 谓词的“非”进行逻辑“或”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate predicate9 = QEntity.entity.field9.eq("value9");
builder.orNot(predicate9);
// 结果为:(field1 = "value1" AND field2 = "value2") OR NOT field9 = "value9"
not 方法

BooleanBuilder not() 对当前谓词进行逻辑“非”操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
builder.not();
// 结果为:NOT (field1 = "value1" AND field2 = "value2")

3. 其他方法

accept 方法

<R, C> R accept(Visitor<R, C> v, C context) 接受一个访问者对象,用于处理当前谓词。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Visitor<String, Void> visitor = new MyVisitor();
String result = builder.accept(visitor, null);
clone 方法

BooleanBuilder clone() throws CloneNotSupportedException 克隆当前 BooleanBuilder 实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BooleanBuilder clonedBuilder = builder.clone();
equals 和 hashCode 方法

boolean equals(Object o)int hashCode() 用于判断当前对象与另一个对象是否相等,并返回当前谓词的哈希码。

getValue 方法

@Nullable Predicate getValue() 获取当前的谓词值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Predicate currentPredicate = builder.getValue();
hasValue 方法

boolean hasValue() 判断当前谓词是否有值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boolean hasValue = builder.hasValue();
getType 方法

Class<? extends Boolean> getType() 返回布尔类型的类对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class<? extends Boolean> type = builder.getType();
toString 方法

String toString() 返回当前谓词的字符串表示形式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String predicateString = builder.toString();

二、案例

为了更好地理解 BooleanBuilder 的使用,我们将通过几个完整的案例来展示如何在实际应用中利用这个类构建复杂的查询条件。

案例 1:用户筛选

假设我们有一个用户表 User,我们希望根据多个可选条件来筛选用户,例如用户名、年龄范围和是否激活。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.querydsl.core.BooleanBuilder;
import com.querydsl.sql.SQLQueryFactory;
import java.util.List;

public class UserFilter {

    private final SQLQueryFactory queryFactory;

    public UserFilter(SQLQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    /**
     * 根据用户名、年龄范围和激活状态筛选用户
     * 
     * @param username 用户名
     * @param minAge 最小年龄
     * @param maxAge 最大年龄
     * @param isActive 是否激活
     * @return 满足条件的用户列表
     */
    public List<User> filterUsers(String username, Integer minAge, Integer maxAge, Boolean isActive) {
        QUser qUser = QUser.user;

        // 初始化 BooleanBuilder
        BooleanBuilder builder = new BooleanBuilder();

        // 根据用户名构建条件
        if (username != null) {
            builder.and(qUser.username.eq(username));
        }

        // 根据最小年龄构建条件
        if (minAge != null) {
            builder.and(qUser.age.goe(minAge));
        }

        // 根据最大年龄构建条件
        if (maxAge != null) {
            builder.and(qUser.age.loe(maxAge));
        }

        // 根据激活状态构建条件
        if (isActive != null) {
            builder.and(qUser.isActive.eq(isActive));
        }

        // 执行查询并返回结果
        return queryFactory.selectFrom(qUser)
                           .where(builder)
                           .fetch();
    }
}

案例 2:产品搜索

假设我们有一个产品表 Product,我们希望根据名称、价格区间和类别来进行搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.querydsl.core.BooleanBuilder;
import com.querydsl.sql.SQLQueryFactory;
import java.util.List;

public class ProductSearch {

    private final SQLQueryFactory queryFactory;

    public ProductSearch(SQLQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    /**
     * 根据名称、价格区间和类别搜索产品
     * 
     * @param name 产品名称
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param category 产品类别
     * @return 满足条件的产品列表
     */
    public List<Product> searchProducts(String name, Double minPrice, Double maxPrice, String category) {
        QProduct qProduct = QProduct.product;

        // 初始化 BooleanBuilder
        BooleanBuilder builder = new BooleanBuilder();

        // 根据名称构建条件
        if (name != null) {
            builder.and(qProduct.name.containsIgnoreCase(name));
        }

        // 根据最低价格构建条件
        if (minPrice != null) {
            builder.and(qProduct.price.goe(minPrice));
        }

        // 根据最高价格构建条件
        if (maxPrice != null) {
            builder.and(qProduct.price.loe(maxPrice));
        }

        // 根据类别构建条件
        if (category != null) {
            builder.and(qProduct.category.eq(category));
        }

        // 执行查询并返回结果
        return queryFactory.selectFrom(qProduct)
                           .where(builder)
                           .fetch();
    }
}

案例 3:订单查询

假设我们有一个订单表 Order,我们想根据客户ID、订单状态和日期范围来查询订单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.querydsl.core.BooleanBuilder;
import com.querydsl.sql.SQLQueryFactory;
import java.time.LocalDate;
import java.util.List;

public class OrderQuery {

    private final SQLQueryFactory queryFactory;

    public OrderQuery(SQLQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    /**
     * 根据客户ID、订单状态和日期范围查询订单
     * 
     * @param customerId 客户ID
     * @param status 订单状态
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 满足条件的订单列表
     */
    public List<Order> queryOrders(Long customerId, String status, LocalDate startDate, LocalDate endDate) {
        QOrder qOrder = QOrder.order;

        // 初始化 BooleanBuilder
        BooleanBuilder builder = new BooleanBuilder();

        // 根据客户ID构建条件
        if (customerId != null) {
            builder.and(qOrder.customerId.eq(customerId));
        }

        // 根据订单状态构建条件
        if (status != null) {
            builder.and(qOrder.status.eq(status));
        }

        // 根据开始日期构建条件
        if (startDate != null) {
            builder.and(qOrder.orderDate.goe(startDate));
        }

        // 根据结束日期构建条件
        if (endDate != null) {
            builder.and(qOrder.orderDate.loe(endDate));
        }

        // 执行查询并返回结果
        return queryFactory.selectFrom(qOrder)
                           .where(builder)
                           .fetch();
    }
}

三、总结

BooleanBuilder 提供了一种灵活且方便的方式来构建复杂的逻辑条件表达式。通过链式调用,开发者可以轻松地组合多个条件,从而生成复杂的查询逻辑。在实际应用中,它常用于构建动态查询条件,根据不同的业务需求生成相应的 SQL 语句。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
谷歌地球接口Google Maps APIs地图样式设计调整与JSON或URL导出
  本文介绍在谷歌地球API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法。
疯狂学习GIS
2021/09/09
1.5K0
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
在现代前端开发中,地图应用变得越来越重要,特别是在数据可视化、地理信息系统和移动应用中。本文将详细比较四款流行的地图库:Mapbox、OpenLayers、Leaflet 和 Cesium,分析它们的特点、功能、开源情况、包体积、市场占有率、适宜人群与应用环境,并提供安装与基础使用代码示例。
watermelo37
2025/01/22
1.3K0
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
从小白到高手,Tiler库助你快速掌握Python图像处理!
Python的Tiler库是一个功能强大的工具,专门用于生成自定义地图瓦片和进行图像切片处理。无论是在地理信息系统(GIS)中还是在图像处理和计算机视觉任务中,Tiler都提供了丰富的功能和选项。
小白的大数据之旅
2025/05/16
1350
OpenStreetMap介绍与OSM数据多种下载方法对比
  本文对OpenStreetMap(OSM)网页与各类OSM数据的多种下载方式加以详细介绍,并对不同数据下载方式加以对比。OSM数据包含道路与铁路路网、建筑、水体、土地利用、兴趣点、行政区边界等各类数据,同时具有.shp、.pbf、.osm、.csv等多种类型,方便大家不同的使用需求。在这里有一点需要注意:OSM数据在国家边界数据方面非常不准确,如有相关需求,大家可以从其它网站获取对应边界数据。
疯狂学习GIS
2023/07/09
3.2K0
OpenStreetMap介绍与OSM数据多种下载方法对比
可视化分析工具大集合,让数据美如画
导读:大数据时代,得数据者得天下。巧妇难为无米炊,拥有数据却不知道如何利用,就不能体现数据的价值。而数据可视化作为处理数据的重要步骤,一直被广泛应用。冷冰冰的数据,经过可视化技术的加工,便酒曲入瓮般幻
钱塘数据
2018/03/06
2.6K0
可视化分析工具大集合,让数据美如画
【干货】数据可视化分析工具大集合
Excel Excel作为一个入门级工具,是快速分析数据的理想工具,也能创建供内部使用的数据图,但是Excel在颜色、线条和样式上课选择的范围有限,这也意味着用Excel很难制作出能符合专业出版物和网
钱塘数据
2018/03/05
2.7K0
【干货】数据可视化分析工具大集合
只会Excel怎么够?这49款数据可视化神器推荐收藏
新媒体管家 大数据时代,你还在拿Excel做的图表提交给Boss看吗?有没有想过用其他更炫酷的工具让Boss眼前一亮呢?为了让大家了解如何选择适合的数据可视化产品,小编整理了50款可以用来做数据可视化
钱塘数据
2018/03/06
3.9K0
只会Excel怎么够?这49款数据可视化神器推荐收藏
WebGIS开发框架及其特点
WebGIS(Web Geographic Information System)是基于Web技术的地理信息系统,能够通过浏览器实现地理数据的展示、分析和交互。以下是常见的WebGIS开发框架及其特点。
数字孪生开发
2024/12/31
4110
WebGIS开发框架及其特点
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
  本文对GIS行业相关的综合数据获取网站加以整理,包括但不限于遥感数据、气候数据、土地数据、土壤数据、农业数据、行政区数据、社会数据、经济数据等。数据较多,大家可以直接通过下方目录加以总览。
郭好奇同学
2021/05/28
5.2K0
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
【收藏】55 款可视化分析工具,优秀数据分析师必备!
俗话说的好:工欲善其事,必先利其器!一款好的工具可以让你事半功倍,尤其是在大数据时代,更需要强有力的工具通过使数据有意义的方式实现数据可视化,还有数据的可交互性;我们还需要跨学科的团队,而不是单个数据
CDA数据分析师
2018/02/11
2.6K0
【收藏】55 款可视化分析工具,优秀数据分析师必备!
R语言,你要怎样画地图?
不知道各位平常有没有过需要画地图的需求,有的时候需要在地图上标出特定位置的数据表现或者一些数值,然而怎么实现? 这里主要介绍下在R语言中绘制地图的个人琢磨的思路。绘制地图步骤有三: 你得需要绘制地图;(约等于废话) 你得有要绘制地图的地理信息,经纬度啊,边界啊等等; 你得利用2的数据在R中画出来。 以上步骤中,目前最关键的是2,一旦2的数据有了,在R中不就是把它们连起来嘛,这个对于R来说就是调戏它,就跟全民调戏小黄鸡一样。 R语言中绘制地图的思路也是由于2的获取方式不一样而分开的。 第一种思路:有一些R包
机器学习AI算法工程
2018/03/13
11.8K0
R语言,你要怎样画地图?
55款大数据分析神器:你还在用Excel?
来源:DataCastle数据城堡(ID:DataCastle2016)、大数据分析和人工智能(ID:datakong)
IT阅读排行榜
2019/11/12
1.3K0
55款大数据分析神器:你还在用Excel?
自动驾驶中基于车道线的高清制图方法回顾
HD Map,高清地图,在自动驾驶领域被看得很重,因为它能提供prior知识,让感知难度降低,同时让规划有的放矢。
YoungTimes
2022/04/28
1.1K0
自动驾驶中基于车道线的高清制图方法回顾
(数据科学学习手札41)folium基础内容介绍
  folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm或自行获取的osm资源和地图原件进行地理信息内容的可视化,以及制作优美的可交互地图。其语法格式类似ggplot2,是通过不断添加图层元素来定义一个Map对象,最后以几种方式将Map对象展现出来。
Feffery
2018/07/10
6.2K0
自动驾驶中基于车道线的高清制图方法回顾
HD Map,高清地图,在自动驾驶领域被看得很重,因为它能提供prior知识,让感知难度降低,同时让规划有的放矢。高清地图目前有两条路,即激光雷达扫描为主的高成本制图方法和摄像头为主的低成本制图方法。
小白学视觉
2020/06/19
1.6K0
自动驾驶中基于车道线的高清制图方法回顾
YashanDB在地理信息系统(GIS)领域的关键功能和技术优势
地理信息系统(Geographic Information System,简称GIS)是⼀种集成的计算机系统,⽤于捕获、存储、分析、管理和展⽰所有类型的地理数据。GIS的核⼼功能和原理可以从以下⼏个⽅⾯进⾏详细阐述:
用户10349277
2025/02/25
1260
【功能预告】地图可视化之兴趣点轮廓线可视化,最细颗粒度的自动化可视化地图数据包制作
只要是标准的POI搜索,就可以在高德地图上清晰地出现其轮廓线,此轮廓线就是我们接下来制作地图数据包的源材料。
Excel催化剂
2021/08/18
1.5K0
Cesium笔记(3):基本控件简介—ImageryProvider地图瓦片地图配
cesiumjs中可定制多种图层,可以使用互联网上很多地图提供商的图层数据,也可以使用自己的地图数据。Cesium支持多种标准化格式的GIS瓦片服务,可以把栅格图层绘制到地球的表面——cesiumjs的地图图层本质上是一些瓦片数据,这些图层的亮度、对比度、色相均可以动态调整。
周陆军
2020/06/06
5.5K0
谷歌开源交互式可视化 GPS 数据库(附 20+数据集)
【新智元导读】谷歌研究院官方博客(北京时间)今日更新,宣布开源与哈佛大学等高校和机构合作完成的一个交互式可视化 GPS 地球地震周期物理学数据库。不仅如此,本文后附 20+ 更多奇异有趣的数据集,万一哪天用上了呢? 谷歌希望借开源产品,打造数据数集生态 (文/Jimbo Wilson,Google Big Picture Team 软件工程师;Brendan Meade,哈佛大学地球与行星科学系教授)为了帮助研究人员更好地了解地震周期并探索相关数据,谷歌研究院发布了一种新的交互式数据可视化方法,通过相对于真
新智元
2018/03/26
2K0
谷歌开源交互式可视化 GPS 数据库(附 20+数据集)
如何使用Python和开放数据构建爱丁堡Beergardens的交互式地图
随着夏天终于到来,想知道在爱丁堡外面享用一杯美味的冷饮的好地方。因此将关于主席许可的开放数据集与一些地理编码相结合,并创建了一个在爱丁堡外部座位的交互式地图。
代码医生工作室
2019/07/05
2K0
如何使用Python和开放数据构建爱丁堡Beergardens的交互式地图
推荐阅读
相关推荐
谷歌地球接口Google Maps APIs地图样式设计调整与JSON或URL导出
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 深入理解 QueryDSL 的 BooleanBuilder:构建复杂逻辑表达式
  • 一、方法介绍
    • 1. 构造方法
      • 默认构造方法
      • 带初始值的构造方法
    • 2. 逻辑运算方法
      • and 方法
      • andAnyOf 方法
      • andNot 方法
      • or 方法
      • orAllOf 方法
      • orNot 方法
      • not 方法
    • 3. 其他方法
      • accept 方法
      • clone 方法
      • equals 和 hashCode 方法
      • getValue 方法
      • hasValue 方法
      • getType 方法
      • toString 方法
  • 二、案例
    • 案例 1:用户筛选
    • 案例 2:产品搜索
    • 案例 3:订单查询
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档