是否可以在Spring Data Rest中使用和组合WHERE子句?

问题描述 投票:0回答:2

我正在使用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子句的这种组合?

java spring hibernate spring-data-jpa spring-data-rest
2个回答
0
投票

您应该能够自定义存储库,以使用带有所有必需参数的搜索方法。然后,它们将与所有查询参数一起显示在搜索资源下的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);

0
投票

最终,我基于该library使用了Spring Data Jpa + RSQL(Rest查询语言)>

它允许动态执行带有嵌套where子句的任何过滤逻辑。过滤器本身只是一个字符串:String filter = "field1=='val1' and (field2=='val2' and (field3 > 56 or field4 > 23))";,因此您可以传递任何过滤器(根据rsql正确构建,否则它将无法解析您的请求),并在需要时轻松对其进行修改。

lib本身将给定的过滤器转换为规范或谓词(您可以选择),如果需要,可以很容易地将limitorderBy添加到最终请求中。

© www.soinside.com 2019 - 2024. All rights reserved.