spring-data多表多条件动态查询

博客围绕Spring Data进行多表多条件动态查询展开。先介绍了HdTalent、HdStaffPool、HdTalentPool三张表的对应关系,包括多对一和多对多关系。接着说明需求是根据HdTalentPool名称查询HdStaffPool,且为动态条件查询。还阐述了实现过程,需继承相关接口,调用findAll方法并传入动态参数,最后有JUNIT测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、表对应关系

1、HdTalent,HdStaffPool  多对一关系,其中HdTalent为多方,HdStaffPool  为一方。

2、HdTalentPool,HdTalent  多对一关系,其中HdTalentPool为多方,HdTalent  为一方。

3、由此HdTalentPool、HdStaffPool  组成多对多的关系。

二、需求描述

需要根据HdTalentPool中名称查询HdStaffPool  ,且HdStaffPool 的属性为动态条件查询。

三、实现过程

 

spring-data的的dao为Repsitory,需要继承JpaRepository,JpaSpecificationExecutor接口。如下图:

只需要调用findAll方法,传入动态参数即可。首先需要进行动态连接,关键代码如下:

List<Predicate> predicates = new ArrayList<>();

/// HdTalent,HdStaffPool表进行内联

Join<HdTalent,HdStaffPool> talentJoin=root.join("hdTalents",JoinType.INNER);

// HdTalentPool,HdTalent表进行内联

Join<HdTalentPool,HdTalent> talentPoolJoin =talentJoin.join("hdTalentPool",JoinType.INNER);

predicates.add(cb.like(talentPoolJoin.get("talentName"),conditions.get("talentName").toString()));

备注:3张表建立1对多的关系。参考百度搜索OnetoMany与ManyToOne有很多资料。

完整代码截图如下:

四、JUNIT测试过程

测试代码

执行结果

五、ManyToOne与OneToMany

ManyToOne

OneToMany

### 使用 `spring-boot-starter-data-elasticsearch` 实现参数查询 为了实现在 Spring Boot 应用程序中通过个参数来查询 Elasticsearch 数据库,可以利用 `ElasticsearchRepository` 接口提供的方法定义功能。Spring Data Elasticsearch 支持种方式构建复杂的查询逻辑。 #### 方法一:使用自定义查询语句 可以通过在接口的方法名上指定条件来进行简单的组合查询: ```java public interface ProductRepository extends ElasticsearchRepository<Product, String> { List<Product> findByTitleAndDescription(String title, String description); } ``` 这种方法适用于字段较少的情况,当涉及更复杂条件时,则推荐采用更灵活的方式[^1]。 #### 方法二:使用 QueryDSL 或者 Criteria API 构建动态查询 对于更加复杂的场景,比如需要支持任意数量的不同类型的过滤器,应该考虑使用 QueryDSL 或者 Criteria API 来创建动态查询对象。这允许开发者根据实际传入的参数情况构造相应的布尔达式树结构。 下面是一个例子展示如何使用 `CriteriaQuery` 进行参数查询: ```java import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; // ... @Autowired private ElasticsearchOperations operations; public Iterable<SearchHit<Product>> searchProductsByMultipleParams( Optional<String> title, Optional<Integer> minPrice, Optional<Integer> maxPrice) { var criteria = new Criteria(); if (title.isPresent()) { criteria.and("title").is(title.get()); } if (minPrice.isPresent() && maxPrice.isPresent()) { criteria.and("price").between(minPrice.get(), maxPrice.get()); } else if (minPrice.isPresent()) { criteria.and("price").greaterThanOrEqualTo(minPrice.get()); } else if (maxPrice.isPresent()) { criteria.and("price").lessThanOrEqualTo(maxPrice.get()); } return operations.search(new CriteriaQuery(criteria), Product.class); } ``` 这段代码展示了如何接收来自客户端请求中的可选参数,并据此建立一个或个筛选条件[^2]。 #### 方法三:使用 Native Search 查询 如果上述两种方案都不能满足需求,还可以直接编写原生 JSON 形式的查询字符串并通过 `NativeSearchQueryBuilder` 提交给 ES 集群执行。这种方式提供了最大的灵活性,几乎能够覆盖所有的查询需求。 ```java import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.Query; // ... import static org.elasticsearch.index.query.QueryBuilders.*; // 创建查询 Query query = new NativeSearchQueryBuilder() .withQuery(boolQuery() .must(termQuery("field", "value")) .filter(rangeQuery("age").gte(0).lte(90)) ) .build(); Iterable<YourEntityClass> results = elasticsearchTemplate.queryForList(query, YourEntityClass.class); ``` 此片段说明了怎样组装包含布尔运算符以及范围限定在内的高级查询[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值