我需要使用 SpringBoot REST实现复杂的搜索功能,并使用 Criteria API 实现Spring Data JPA。我需要提供如下所示的 RPI/college?select=*&where=name:DemoCollege
和location:LA
和staff{firstName:foo, lastName:boo, workExp>10}
并输入[1,2,3]
拼贴对象具有name
、location
、type
字段和staff
列表。 它与Staff
onetomany
关系College
因此可以有一名或多名工作人员。
根据 uri,我需要使用条件 API 构建查询。
我发现实现toPredicate()
方法非常复杂org.springframework.data.jpa.domain.Specification
.有没有处理如此复杂的搜索过滤器的这样的例子?
提前谢谢。
我认为在您的情况下,最好的选择是规范-arg-解析器库,它提供了以声明方式构建规范的便捷方式。例如,此代码:
@RequestMapping("/customers")
public Object findByName(
@And({
@Spec(path="registrationDate", params="registeredBefore", spec=DateBefore.class),
@Spec(path="lastName", spec=Like.class)}) Specification<Customer> customerSpec) {
return customerRepo.findAll(customerSpec);
}
对应于此请求:
GET http://myhost/customers?registeredBefore=2015-01-18&lastName=Simpson
它支持以下规范:Like,LikeIgnoreCase,Equal,EqualIgnoreCase,In,Null,NotNull,GreaterThan,GreaterThanOrEqual,LessThan,LessThanOrEqual,DateBetween,Join,Join fetch,它允许您组合它们,组成复杂的表达式。
另一个选项是Querydsl和Web支持Spring Data扩展。它还允许您构建"REST 查询语言",但可能性较小。你可以在我的回答中阅读如何使用它:https://stackoverflow.com/a/48596145