如何解决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);
}
上面的代码有几个明显的问题:
- 如果查询参数的数量将增加,则表示此参数增长非常快且难以维护。 问题:有什么方法可以构建具有动态参数数量的查询?
- 此代码不包含支持游标的机制。 问题: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库编写查询模板
在执行该方法之前,根据您的参数,查询模板将内置到不同的查询字符串中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。