我正在使用Spring Boot Spring Data编写应用程序。而且我正在尝试基于不同的过滤器参数实现过滤功能。
我发现了开箱即用的Spring Data REST框架,它支持基本的过滤操作,例如:
/myEntities?field1=value1&field2=value2&sort=field2,desc&size=10&page=2
在这种情况下,我们仅按2个字段进行过滤,而没有任何其他where子句。
但是如果我需要一个更复杂的过滤器,该过滤器对我的实体使用不同数量的where子句,顺序和限制?结果查询可能看起来像这样:
SELECT * FROM table
WHERE field1 != `value1` and (field1 != ` value2 `OR (field1 = `value3` AND filed2 < 3))
AND field2 != 99
是否有可能使用Spring Data Rest的内置功能(将所有这些内容作为http参数发送)实现不同的where子句的这种组合?
您应该能够自定义存储库,以使用带有所有必需参数的搜索方法。然后,它们将与所有查询参数一起显示在搜索资源下的Spring Data Rest中。
类似:
@RestResource(path = "weirdFilter", rel = "weirdFilter")
@Query(value = "SELECT * FROM table
WHERE field1 != :value1 and (field1 != :value2 OR (field1 = :value3 AND field2 < 3))
AND field2 != 99")
public Page<Stuff> findByWeirdFilter(@Param("value1") String value1, @Param("value2") String value2, @Param("value3") String value3, Pageable p);
最终,我基于该library使用了Spring Data Jpa + RSQL(Rest查询语言)>
它允许动态执行带有嵌套where子句的任何过滤逻辑。过滤器本身只是一个字符串:String filter = "field1=='val1' and (field2=='val2' and (field3 > 56 or field4 > 23))";
,因此您可以传递任何过滤器(根据rsql正确构建,否则它将无法解析您的请求),并在需要时轻松对其进行修改。
lib本身将给定的过滤器转换为规范或谓词(您可以选择),如果需要,可以很容易地将limit
和orderBy
添加到最终请求中。