SpringBoot动态构建查询

问题描述

我正在使用SpringBoot 2.3.1和Spring Data访问PostgreSQL。我有以下简单的控制器:

@RestController
public class OrgsApiImpl implements OrgsApi {
    @Autowired
    Orgs repository;

    @Override
    public ResponseEntity<List<OrgEntity>> listOrgs(@Valid Optional<Integer> pageLimit,@Valid Optional<String> pageCursor,@Valid Optional<List<String>> domainId,@Valid Optional<List<String>> userId) {

        List<OrgEntity> orgs;

        if (domainId.isPresent() && userId.isPresent()) {
            orgs = repository.findAllByDomainIdInAndUserIdIn(domainId.get(),userId.get());
        } else if (domainId.isPresent) {
            orgs = repository.findAllByDomainIdIn(domainId.get());
        } else if (userId.isPresent()) {
            orgs = repository.findAllByUserIdIn(userId.get());
        } else {
            orgs = findAll();
        }

        return ResponseEntity.ok(orgs);
    }
}

还有一个简单的JPA存储库:

public interface Orgs extends JpaRepository<OrgEntity,String> {
    List<OrgEntity> findAllByDomainIdIn(List<String> domainIds);

    List<OrgEntity> findAllByUserIdIn(List<String> userIds);

    List<OrgEntity> findAllByDomainIdInAndUserIdIn(List<String> domainIds,List<String> userIds);
}

上面的代码有几个明显的问题:

  1. 如果查询参数的数量将增加,则表示此参数增长非常快且难以维护。 问题:有什么方法可以构建具有动态参数数量的查询?
  2. 此代码不包含支持游标的机制。 问题:Spring Data中是否有任何工具可支持基于游标的查询?

如果回答了第一个问题,第二个问题就很容易阅读。

提前谢谢!

解决方法

tl; dr

全部在the reference documentation中。

详细信息

Spring Data模块广泛支持Querydsl来构建in the reference documentation中所述的动态查询。特别是对于Spring Data JPA,在JPA Criteria API之上还支持Specifications。对于简单排列,也可以选择query by example

对于第二个问题,Spring Data存储库支持streaming over results。就是说,假设出于性能原因要执行此操作,那么JPA首先可能不是最合适的选择,因为它的实体生命周期模型仍会保留已处理的项目。如果仅是逐页或逐片访问结果的子集,那么也就是supported

为了在大型数据集上实现更高效的流传输,建议通过jOOQ(可以与支持关系数据库的任何Spring Data模块一起使用)使用纯SQL,Spring Data JDBC甚至是{ {3}}(如果需要反应式编程)。

,

您可以使用spring-dynamic-jpa库编写查询模板

在执行该方法之前,根据您的参数,查询模板将内置到不同的查询字符串中。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...