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 {
   

    @Id
    private 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;
}

相关推荐

  1. JPA + ES 动态条件查询

    2024-02-01 09:14:03       31 阅读
  2. JPA构建多条件查询

    2024-02-01 09:14:03       38 阅读
  3. JPA使用CriteriaQuery实现动态分组查询

    2024-02-01 09:14:03       21 阅读
  4. 数据库查询--条件查询

    2024-02-01 09:14:03       12 阅读
  5. 在Django中使用Q对象和条件运算符来构建动态查询

    2024-02-01 09:14:03       44 阅读
  6. Es条件查询

    2024-02-01 09:14:03       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-01 09:14:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-01 09:14:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-01 09:14:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-01 09:14:03       20 阅读

热门阅读

  1. 将多个excel文件中的特定数据汇总到一个excel中

    2024-02-01 09:14:03       34 阅读
  2. OracleASCII码值有哪些

    2024-02-01 09:14:03       34 阅读
  3. ChatGPT:人工智能对话的革命

    2024-02-01 09:14:03       35 阅读
  4. 2024 高级前端面试题之 前端工程相关 「精选篇」

    2024-02-01 09:14:03       33 阅读
  5. 贪心算法c++

    2024-02-01 09:14:03       29 阅读
  6. Flink Native Library xxx is being loaded in another classloader

    2024-02-01 09:14:03       32 阅读
  7. sql注入之字符型注入

    2024-02-01 09:14:03       23 阅读
  8. kylin启动memcached缓存

    2024-02-01 09:14:03       33 阅读
  9. 倒计时68天

    2024-02-01 09:14:03       40 阅读