JPA + ES 动态条件查询

为什么写这篇文章

  • 网上大量关于 jpa + mysql 动态条件查询的博客,但缺少 jpa + es 动态条件查询博客,找到的都是质量不高的文章,不能真正跑通
  • 如果不用动态条件查询,当有多个条件进行查询时就非常麻烦,例如有 4 个参数,则一共要写 4 * 3 * 2 * 1 查询语句

依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>2.3.12.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.3.12.RELEASE</version></dependency>

实体类

package cn.xxx.api.project.dal.es.dataobject;import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;@Data
@Document(indexName = "user_index")
@ToString
public class EsUserDO {@Idprivate Long id;@Field(type = FieldType.Long)private Long appId;/** 用户昵称 */@Field(type = FieldType.Keyword)private String name;@Field(type = FieldType.Keyword)private String sex;@Field(type = FieldType.Boolean)private Boolean available;
}

DAO

package cn.xxx.api.project.dal.es.dao;import cn.xxx.api.project.dal.es.dataobject.EsUserDO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface EsUserDAO extends ElasticsearchRepository<EsUserDO, Long> {
}

动态条件查询

import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;/*** es 动态条件查询用户信息** @param appId     应用ID* @param name      用户名* @param sex       性别* @param available 是否可用* @param page      第几页(从 1 开始)* @param size      每页条数* @return*/
public Page<EsUserDO> searchUsers(Long appId, String name, String sex, Boolean available, Integer page, Integer size) {log.debug("searchUsers-start appId : {} name : {} sex : {} available : {} page : {} size : {}", appId, name, sex, available, sex, page, size);Pageable pageable = PageRequest.of(page - 1, size);BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();if (Objects.nonNull(appId)) {boolQuery.must(QueryBuilders.termQuery("appId", appId));}if (StringUtils.isNotEmpty(name)) {boolQuery.must(QueryBuilders.termQuery("name", name));}if (StringUtils.isNotEmpty(sex)) {boolQuery.must(QueryBuilders.termQuery("sex", sex));}if (Objects.nonNull(available)) {if (available) {boolQuery.must(QueryBuilders.termQuery("available", available));} else {// 查询 available 为 false 或者不存在该字段的数据BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery().should(QueryBuilders.termQuery("available", available)).should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("available")));boolQuery.must(shouldQuery);}}Page<EsUserDO> search = esUserDAO.search(boolQuery, pageable);log.info("searchUsers-end boolQuery : {} search : {}", boolQuery.toString(), JSON.toJSONString(search));return search;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目基金撰写与技巧及GPT融合

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;项目基金撰写与技巧及GPT融合 一&#xff1a;国自然项目 1.1项目 1.2接收情况 1.3受理情况 1.4近五年资助情况 1.5国自然改革解读 1.6博后项目 二&#xff1a;基金的撰写技巧 2.1 问题属性与评阅标准 2.2 前期…

【代码随想录】刷题笔记Day56

前言 26回了老家参加二姨的婚礼&#xff0c;还逛了几圈亲戚&#xff0c;回来就接家教的活&#xff0c;想到还要刷题开组会&#xff0c;回家注定是没法怎么休息啦&#xff0c;可恶 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 暴力解法&#xff08;双指针优化&#xf…

Kafka核心概念、数据存储设计及Partition数据文件 生产者负载均衡策略、批量发送技巧、消息压缩手段、消费者设计

关注公众号&#xff0c;发送 “面试题” 即可免费领取一份超全的面试题PDF文件&#xff01;&#xff01;&#xff01;&#xff01; 1、kafka的概念 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由LinkedIn开发&#xff0c;后来成为Apache软件基金会的一个顶级项目。它…

SpringAop实现访问日志功能的添加

AOP 是 Spring 体系中非常重要的两个概念之一&#xff08;另外一个是 IoC&#xff09;&#xff0c;今天这篇文章就来带大家通过实战的方式&#xff0c;在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层添加一个切面来实现接口访问的统一日志记录。 #一、关于 AOP AO…

讯飞星火V3.5发布,一场大模型的奇幻之旅(深度体验讯飞星火V3.5)

在去年的人工智能领域&#xff0c;大模型无疑是最炙手可热的技术话题。其强大的数据处理和深度学习能力&#xff0c;为众多领域带来了革命性的变革。而其中&#xff0c;讯飞星火表现尤为出色&#xff0c;成为了行业的翘楚&#xff0c;得到了大量的用户认可&#xff0c;其中&…

day38 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

动态规划是前一个状态推导过来的&#xff0c;贪心是局部最优解。 class Solution { public:int fib(int n) {int a0;int b1;int res0;if(n1) return 1;for(int i2;i<n;i){resab;ab;bres;}return res;} }; 可以由前面状态推出后面状态&#xff0c;是动态规划。由于始终只要后…

C++20 协程原理与应用

协程 要想了解协程&#xff0c;最好先搞清楚进程&#xff0c;线程&#xff0c;这样才能将三者区分开来&#xff01; 进程 vs 线程 vs 协程 进程线程协程切换者操作系统操作系统用户&#xff08;编程者&#xff09;切换时机根据操作系统自己的切换策略&#xff0c;用户不感知根…

最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版

本文记录最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版。 一、镜像获取 1、下载镜像 移动云官方网站 最新镜像为2023-11-02 15:04:56更新的BCLinux-for-Euler-21.10-dvd-x86_64-230731版 直接下载地址&#xff1a;https://mirrors.cmecloud.cn/bclinux/oe21.10/I…

初始化服务器

初始化服务器 最小化安装 1为你的服务器配置root密码 2配置ip地址 VMNAT8 NAT模式 备份文件cp /etc/sysconfig/network-scripts/ifcfg-ens33 /tmp/vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY&…

【Linux】线程池的简易实现(懒汉模式)

文章目录 前言一、懒汉方式1.普通模式1.线程安全模式 二、源代码1.Task.hpp(要执行的任务)2.ThreadPool.hpp(线程池)3.Main.cpp 前言 线程池: 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监…

java之mybatis入门

大前题 正确创建好了springboot工程&#xff0c;极其依赖 配置数据库连接 application.yml spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/cangqiongusername: rootpassword: rootlombok Data 自动生成代码&#xff08…

五种主流数据库:从无序到有序

SQL 查询不保证返回结果的顺序。如果我们想要按照某种规则对结果进行排序显示&#xff0c;例如按照工资从高到低进行排序&#xff0c;需要使用 ORDER BY 子句。 本文比较五种主流数据库对查询结果排序的实现和差异&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及…

二分查找下界(c++题解)

题目描述 在一个N个元素的不递减数列中&#xff0c;查找大于或等于X的第一个位置&#xff0c;如果找不到则输出n1。下标范围从1~N。 输入格式 共3行 第一行一个n (1 ≤ n ≤ 1000000) 第二行n个不递减的整数 第三行查找目标数x 数据都在int范围内 输出格式 第一个大于…

【免费分享】概率神经网络的分类预测--基于PNN的变压器故障诊断

主要内容 ​《MATLAB神经网络43个案例分析》共有43章&#xff0c;内容涵盖常见的神经网络&#xff08;BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等&#xff09;以及相关智能算法&#xff08;SVM、决策树、随机森林、极限学习机等&#xff09;。同时&#x…

Java 对部分接口返回数据进行加密,或其他处理

业务场景&#xff1a;后端项目中分为PC端和移动端接口&#xff0c;移动端为例如 mobile 开头的URl&#xff0c;需求为调用移动端接口时&#xff0c;对返回数据进行加密&#xff0c;PC端不加密 import cn.hutool.core.date.DatePattern; import cn.hutool.json.JSONConfig; impo…

系统架构设计师-22年-下午题目

系统架构设计师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。…

全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

前言 最近开始做这个裂缝识别的任务了&#xff0c;大大小小的问题我已经摸得差不多了&#xff0c;然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务&#xff0c;也就是我们说的裂缝识别的任务。作为前言&#xff0c;先来说说场景&#xff1a; 现在相…

0131-2-关于事件捕获和冒泡

关于事件捕获和冒泡 DOM事件流分为三个阶段&#xff1a;捕获阶段、目标阶段、冒泡阶段 点击目标元素后&#xff0c;不会马上触发目标元素&#xff0c;而是先执行事件捕获&#xff0c;从顶部逐步到目标元素&#xff1b;处于目标阶段的时候触发目标元素&#xff1b;最后冒泡阶段…

如何在Raspberry Pi上启用SSH并结合cpolar内网穿透实现公网远程访问本地树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者&#xff0c;我一直热衷于将设计和技术相结合&#xff0c;尽可能提升用户体验。我最初成为创作者的初心源于学习记录&#xff0c;把创作当作一个笔记&#xff0c;希望把自己遇到的问题&#xff0c;以及学习到的实用技巧记录下来&#xff0c;方便学习回…